我试图在过去几天没有太多运气的情况下找出这个问题。基本上我的gps监听器是这样注册的,用于获取gps事件:
private void registerForNotifications(int gpsActivationIntervalMillis) {
// gps satellite based
gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, gpsActivationIntervalMillis, AppSettings.getMinimumDistance(),gpsLocationListener);
gpsLocationManager.addGpsStatusListener(gpsLocationListener);
}
并取消注册此代码:
private void unRegisterForNotifications() {
gpsLocationManager.removeUpdates(gpsLocationListener);
gpsLocationManager.removeGpsStatusListener(gpsLocationListener);
}
这是在后台服务上完成的,并且可以完美运行。但是,当我尝试通过取消注册&更改间隔时以不同的间隔注册:
private void restart(){ registerForNotification(间隔); unRegisterForNotification(); }
,我遇到了这个:
05-21 13:12:56.354:WARN / MessageQueue(7290):处理程序{460f47a8}在死线程上向处理程序发送消息 05-21 13:12:56.354:WARN /的MessageQueue(7290):了java.lang.RuntimeException:处理程序{460f47a8}发送消息到一个处理程序上的死螺纹 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.os.MessageQueue.enqueueMessage(MessageQueue.java:179) 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.os.Handler.sendMessageAtTime(Handler.java:457) 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.os.Handler.sendMessageDelayed(Handler.java:430) 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.os.Handler.sendMessage(Handler.java:367) 05-21 13:12:56.354:WARN /的MessageQueue(7290):在android.location.LocationManager $ ListenerTransport.onLocationChanged(LocationManager.java:157) 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.location.ILocationListener $ Stub.onTransact(ILocationListener.java:58) 05-21 13:12:56.354:WARN / MessageQueue(7290):在android.os.Binder.execTransact(Binder.java:288) 05-21 13:12:56.354:WARN / MessageQueue(7290):at dalvik.system.NativeStart.run(Native Method) 块引用
看起来像一些死活动/处理程序问题,但不是android应该处理这个?我该如何正确更改gps订阅流程?
答案 0 :(得分:0)
好的,我找到了问题的原因。我的活动中有一个重启按钮,可以正常重启服务。但是当我的AlarmListener试图从后台重启它时,就会启动问题。我错过了应该始终从Looper线程中调用'register'方法的观点!解决方案很简单,只需将重启作业发布到附加到主线程的处理程序,而不是直接从AlarmManager线程调用restart方法。