I am trying to find out this problem without much luck for last couple of days. basically my gps listener is registered like this for getting gps events:
private void registerForNotifications(int gpsActivationIntervalMillis) {
// gps satellite based
gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, gpsActivationIntervalMillis, AppSettings.getMinimumDistance(),gpsLocationListener);
gpsLocationManager.addGpsStatusListener(gpsLocationListener);
}
and it unregisters with this code:
private void unRegisterForNotifications() {
gpsLocationManager.removeUpdates(gpsLocationListener);
gpsLocationManager.removeGpsStatusListener(gpsLocationListener);
}
This is done on a background service and runs perfectly. But when I try to change the interval by doing an unregister & register with different interval:
private void restart() { registerForNotification(interval); unRegisterForNotification(); }
, I run into this:
05-21 13:12:56.354: WARN/MessageQueue(7290): Handler{460f47a8} sending message to a Handler on a dead thread 05-21 13:12:56.354: WARN/MessageQueue(7290): java.lang.RuntimeException: Handler{460f47a8} sending message to a Handler on a dead thread 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.os.Handler.send开发者_运维技巧MessageAtTime(Handler.java:457) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.os.Handler.sendMessageDelayed(Handler.java:430) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.os.Handler.sendMessage(Handler.java:367) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:157) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58) 05-21 13:12:56.354: WARN/MessageQueue(7290): at android.os.Binder.execTransact(Binder.java:288) 05-21 13:12:56.354: WARN/MessageQueue(7290): at dalvik.system.NativeStart.run(Native Method) Blockquote
Looks like some dead activity/handler problem, but isn't android supposed to handle this? How am I supposed to properly change the gps subscription process?
Ok, I found the reason for the problem. I had a restart button in my activity which could restart the service properly. But when my AlarmListener tried to restart it from background, it starts the problem. I missed the point that the 'register' method should always be called from a Looper Thread! Solution is simple, just post the restart job to a handler which is attached to the main thread instead of calling the restart method directly from the AlarmManager thread.
精彩评论