Я борюсь с этим Looper в Android. У меня есть таймер, который запускается каждую минуту. Это отправляет сообщение серверу с местоположением пользователя.Android TimerTask, чтобы получить местоположение gps freezes
private Looper looper;
public boolean getLocation(Context context, LocationResult result) {
locationResult = result;
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//exceptions will be thrown if provider is not permitted.
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
// don't start listeners if no provider is enabled
if (!gps_enabled)
return false;
if(Looper.myLooper() == null)
Looper.myLooper().prepare();
looper = Looper.myLooper();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
looper.loop();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
looper.quit();
lm.removeUpdates(this);
locationResult.gotLocation(location); // broadcast location
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
В первый раз, когда срабатывает таймер, все работает отлично. Во второй раз таймер замерзает, и значок GPS на телефоне говорит, что у него есть замок, но он не исчезает. Это похоже на то, что Looper не зацикливается, чтобы обрабатывать сообщения во второй раз, даже если я говорю ему в цикле. Если я вызываю Looper.prepare() каждый раз, второй раз, когда выполняется таймер, я получаю исключение, говорящее только об одном методе Looper в потоке.
Несомненно, это не должно быть так сложно!