Як я можу використовувати getSystemService в класі неактивності (LocationManager)?


181

У мене виникають проблеми з завантаженням завдань з основного методу Activity OnCreate на інший клас для важкого підйому.

Коли я намагаюся викликати getSystemService з класу без активності, викидається виняток.

Будь-яка допомога буде дуже вдячна :)

lmt.java:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl();
        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

fyl.java

package com.atClass.lmt;

import android.app.Activity;
import android.os.Bundle;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Context;

public class fyl {
    public Location getLocation(){
        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager)getSystemService(context);

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);

        return location;
    }

    public String updateWithNewLocation(Location location) {
        String latLongString;

        if (location != null){
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            latLongString = "Lat:" + lat + "\nLong:" + lng;
        }else{
            latLongString = "No Location";
        }

        return latLongString;
    }
}

2
Додавання винятку та стеження стеження до питання може допомогти потенційним відповідачам
Bert F

Привіт, вибачте за помилку. Виняток видається, якщо я спробую розширити клас активності з цим. Я не хочу розширювати клас активності для цього класу і просто хочу мати можливість викликати getSystemService з мого методу getLocation. Виняток: java.lang.IllegalStateException: Системні сервіси недоступні для заходів перед onCreate ()
Кевін Паркер

Відповіді:


280

Вам потрібно передати свій контекст своєму класу fyl.
Одне рішення - зробити такий конструктор для вашого fylкласу:

public class fyl {
 Context mContext;
 public fyl(Context mContext) {
       this.mContext = mContext;
 }

 public Location getLocation() {
       --
       locationManager = (LocationManager)mContext.getSystemService(context);

       --
 }
}

Тож у вашому класі активності створіть об'єкт fyl у такій onCreateфункції:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl(this); //Here the context is passing 

        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

Вибачте, я не розумію, код буде кориснішим. Якщо що-небудь мені слід передавати об’єкт LocationManager методу getLocation ... Я не знаю, як мені передавати контекст методу, коли я навіть не можу викликати getSystemService, не записуючи цей клас як розширений клас в Activity.
Кевін Паркер

ти спробував це. У onCreate, якщо ви передаєте доступ до контексту за допомогою "цього"
Labeeb Panampullan

але якщо lmtклас не буде виконаний, то у нього flyне буде контексту
Хант

BTW getSysytemService()приймає лише Stringяк параметр. Тому ви не можете пропустити контекст до нього. Як мені це обійти? @Hunt
Parth Sane

2
Просто згадати, Android - менеджери ( BluetoothManager, і ActivityManagerт.д.), також побудовані таким чином (не обов'язково пропускання Activityконтексту їх конструктора) , і саме тому вони можуть отримати доступ компонентів в рамках додатку.
Eido95

47

Ви можете скористатися цим:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
Метод getActivity () не визначений для класу. Ця помилка з’являється.
Дарпан

Який тип класу, в якому ви його використовуєте? тобто це клас приймача, фрагмент, простий клас java або будь-який інший.
Maddy

Потрібно розширити свою активність за допомогою FreagmentActivity замість активності. Сподіваюся, це спрацює для вас ...?
Медді

Це не працює для простого класу, де я хочу поширити ArrayAdapter.
Девід Сільва-Баррера

2
MIne працював, використовуючи getContext () замість getActivity ()!
Амір

16

Один із способів я обминув це - створити статичний клас для екземплярів. Я багато використовував його в AS3. Я дуже добре працював і для мене в розробці андроїдів.

Config.java

public final class Config {
    public static MyApp context = null;
}

MyApp.java

public class MyApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Config.context = this;
    }
    ...
}

Потім ви можете отримати доступ до контексту або за допомогою Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);

4
Проблема, яку я бачу в цьому методі, полягає в тому, що він залишає щось незахищене, що, якби хтось призначив це недійсним, це, ймовірно, призвело б до катастрофічного збою?
Роб

2
Варіант цього варіанту полягає в тому, щоб помістити приватний статик у MyApp, а потім додати getters. private static MyApp _context; public static MyApp getContext() { return _context; }... в OnCreate: _context = this; в OnStop: _context = null;... Використання: MyApp.getContext().
ToolmakerSteve

2
Це може призвести до витоку пам'яті
Yat3s

2
Це абсолютно призведе до витоку пам'яті. В ідеалі не слід використовувати цей процес.
початківець

0

Я не знаю, чи це допоможе, але я зробив це:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);

Правильний спосіб - використовувати статично, як говорить
@Maddy

0

Для деяких занять без активності, наприклад, Worker , вам вже надається об'єкт Context у загальнодоступному конструкторі.

Worker(Context context, WorkerParameters workerParams)

Ви можете просто скористатися цим, наприклад, зберегти його до приватної змінної Context у класі (скажімо, mContext), а потім, наприклад

mContext.getSystenService(Context.ACTIVITY_SERVICE)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.