Что мне нужно сделать, чтобы мой локатор-локатор мог запустить его onLocationChanged?Android onLocationChanged не называется
Я новичок в этом материале (java and android). Вот что я делаю. Я обрабатываю запрос для местоположения, вызывая context.startService (serviceIntent); Внутри службы намерения У меня есть вложенный класс, который будет действовать как LocationListener в стороне метода onHandleIntent. Я запускаю поток, который запрашивает обновления местоположения. . Я поддерживаю ссылку на объект LocationListener и протектор в методе OnHandleIntent.
Мой план предназначен для метода onLocationChanged для обновления переменной, которую я мог бы периодически проверять, чтобы проверить, завершено ли обновление, затем выйти из цикла и сделать что-то с этим местоположением.
Проблема заключается в том, что метод onLocationChanged никогда не вызывается. Объект LocationListener по-прежнему действует до конца метода onHandleIntent. Я могу даже позвонить напрямую и получить отладочное сообщение, которое я ожидаю. Я уверен, что DDMS меняет местоположение, поскольку я распечатал его в различных журналах отладки, и я вижу, как это меняется.
Вот код:
package com.example.locationrequestreceiver;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
public class LocationRequestService extends IntentService {
private LocationManager locationManager;
public class UpdateHandler implements Runnable, LocationListener {
@Override
public void onLocationChanged(Location arg0) {
Log.d("myStuff", "inside location changed");
}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
Log.d("myStuff", "inside thread");
locationManager.requestLocationUpdates("gps", 0, 0, this);
Log.d("myStuff", "run ending");
Looper.loop() // <--- this was the fix
}
}
public LocationRequestService() {
super("LocationRequrestService");
Log.d("myStuff", "inside the service");
}
@Override
protected void onHandleIntent(Intent arg0) {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
UpdateHandler update_handler = new UpdateHandler();
Thread update_handler_thread = new Thread(update_handler);
Log.d("myStuff", "starting thread");
update_handler_thread.start();
for (int count = 0; count < 20; count++) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
Location location = locationManager.getLastKnownLocation("gps");
update_handler.onLocationChanged(location);
}
}
Можете ли вы немного рассказать о том, как это сделать здесь. Я прочитал документ и несколько вещей в HandlerThread, но неясно, как его использовать здесь. – nPn
BTW ... это дало мне подсказку, чтобы вызвать метод Looper.loop() в моем методе run thread, но я хотел бы попытаться заставить HandlerThread работать – nPn
Простым решением было бы просто запустить LocationListener на главном Пользовательский интерфейс. Обновления местоположения по сути являются асинхронными, поэтому они не будут блокировать ваш поток пользовательского интерфейса. Есть ли причина, почему это должно выполняться в отдельном потоке? – ashwin153