Я борюсь с этим Looper в Android. У меня есть таймер, который работает каждую минуту. Это отправляет сообщение на сервер с указанием местоположения пользователя.
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 на поток.
Конечно, это не должно быть так сложно!