Как я могу использовать getSystemService в неактивном классе (LocationManager)? - PullRequest
168 голосов
/ 02 февраля 2011

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

Когда я пытаюсь вызвать getSystemService из класса не-Activity, возникает исключение.

Любая помощь будет принята с благодарностью:)

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;
    }
}

Ответы [ 5 ]

260 голосов
/ 02 февраля 2011

Вам нужно передать свой контекст вашему классу fyl.
Одним из решений является создание конструктора, подобного этому, для вашего fyl класса:

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

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

       --
 }
}

Итак, в вашем классе деятельности создайте объектв 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);
    }
}
44 голосов
/ 06 мая 2014

Вы можете пойти на это:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
14 голосов
/ 19 марта 2012

Один из способов обойти это - создать статический класс для экземпляров.Я много использовал его в AS3. Я отлично работал и в разработке для Android.

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);
0 голосов
/ 03 мая 2016

Не знаю, поможет ли это, но я сделал это:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);
0 голосов
/ 31 декабря 2011
(LocationManager) ((lmt) new Activity()).getSystemService(context);

Попробуйте этот код. Это будет работать, только если вы запустили действие до вызова этой строки кода. Поскольку деятельность должна быть создана и запущена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...