我正在开发一个需要每5-6秒进行一次WiFi扫描的应用程序。 WiFiScanner类作为服务实现,并从主Activity调用。为了每隔几秒重复一次任务,我使用了Handler和postDelayed,间隔为5000毫秒。在设备上安装后,应用程序第一次运行正常。停止WiFi扫描过程,关闭并立即重新打开应用程序会导致崩溃。我想是因为我没有通过在runnable上调用removecallbacks在主活动中明确停止处理程序,而是单击停止只需stop the service。这是logcat引发错误的原因。
06-14 12:30:58.181: ERROR/AndroidRuntime(23534): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS } in com.test.example.WiFiScanner$1@2b0a3880
我正在查看stackoverflow并找到使用AlarmManager的建议。但这不是要求我实现一个BroadcastReciever类,因为它说here?在从主活动调用的服务中执行重复性任务时,还有其他替代方法吗?
答案 0 :(得分:2)
你可以绑定服务而不是启动它。这意味着它是一个本地服务,当没有任何活动绑定到它时它将被停止。但要小心,因为服务在ui线程中运行,所以在后台线程中移动东西。我在这种情况下常用的是一个处理程序,postDelayed runnable执行异步任务,你可以做任何你想做的事情,然后重新安排它,以便它在一段时间内运行。还会在服务被销毁时删除回调并将其设置为粘滞状态,这样如果它被终止,它会重新启动,你也可以在启动时删除回调。
作为替代方案,您可以使用意图服务或简单服务,其中包含在特定时间段内由警报启动的警报,该警报在完成扫描后调用selfStop。但如果你经常运行检查,那么就会产生开销,因为需要反复创建服务(所以最好让它继续运行)。
还有timerTask类,但我只是更好地找到了这2个解决方案。 timer类引入了一个新线程
请参阅:Timer
And This for an implementation
这里有人试图做同样的事情: