GPS管理器上的奇怪的android错误

时间:2011-05-21 03:31:44

标签: android

我试图在过去几天没有太多运气的情况下找出这个问题。基本上我的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订阅流程?

1 个答案:

答案 0 :(得分:0)

好的,我找到了问题的原因。我的活动中有一个重启按钮,可以正常重启服务。但是当我的AlarmListener试图从后台重启它时,就会启动问题。我错过了应该始终从Looper线程中调用'register'方法的观点!解决方案很简单,只需将重启作业发布到附加到主线程的处理程序,而不是直接从AlarmManager线程调用restart方法。