Получить текущее местоположение из проблемы с фоновой службой Android

Я хочу разработать приложение для напоминаний о местоположении. Поэтому я хочу использовать службу Android для получения текущего местоположения, даже если приложение не запущено. Но я этого не сделал. Я установил таймер в классе обслуживания Android, но я не знаю, как получить текущее местоположение в классе обслуживания. В чем проблема ? У меня такая ошибка:

невозможно создать обработчик внутри потока, который не вызвал looper.prepare ()

public class TrackerService extends Service {

    double latShared;
    double lngShared;
    double latService;
    double lngService;
    private LocationManager lm;
    Timer timer;
    Handler handler;
    final static long TIME = 15000;
    SharedPreferences mSharedPrefs;
    SharedPreferences.Editor mPrefsEditor;



    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
        latShared = (double)mSharedPrefs.getFloat("lat", 0);
        lngShared = (double)mSharedPrefs.getFloat("lng", 0);
        timer = new Timer();
        timer.schedule(new TimerTask(){
            @Override
            public void run(){
                LocationUpdates();
            }
        },0,TIME);

    }    

    public void LocationUpdates(){
        locListener locList = new locListener();
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);   
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList);
    }

    @Override
    public void onDestroy() {
        //lm.removeUpdates(this);
        timer.cancel();
    }

    public class locListener implements LocationListener{

        @Override
        public void onLocationChanged(Location location) {
            latService = location.getLatitude();
            lngService = location.getLongitude();
        }

        @Override
        public void onProviderDisabled(String provider) {}

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}


    }

}

person Melih Mucuk    schedule 12.05.2013    source источник
comment
вы можете использовать как запрос вызова для запроса обновления местоположения внутри onResume () и удалить вызов обновления внутри onpause ().   -  person Sunil Kumar    schedule 12.05.2013


Ответы (1)


LocationManager.requestLocationUpdates должен работать в потоке пользовательского интерфейса как его sibling определяет. С другой стороны, TimerTask вводит новый поток, чтобы разгрузить его выполнение.

Однако, если вы не используете новый процесс для своей службы, просто вызовите LocationUpdates(), как показано ниже:

@Override
protected void onCreate() {
    mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
    latShared = (double)mSharedPrefs.getFloat("lat", 0);
    lngShared = (double)mSharedPrefs.getFloat("lng", 0);

    final Handler h = new Handler();
    h.post(new Runnable() {
        @Override
        public void run() {
            LocationUpdates();
            h.postDelayed(this, TIME);
        }
    });
}

ИЛИ, если вы не хотите использовать обработчик, просто обновите свой requestLocationUpdates, как показано ниже:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList, getMainLooper());

В приведенном выше случае getMainLooper() будет отправлять обновления вашего местоположения из потока пользовательского интерфейса.

person waqaslam    schedule 12.05.2013