我使用的重复警报触发一个BroadcastReceiver(OnAlarmReceiver
),后者又调用WakefulIntentService.sendWakefulWork(context, PmNotificationService.class);
在等待来自单独线程的响应时保持处理程序和服务处于活动状态?
下方显示
protected void doWakefulWork(Intent intent) {
// Load auth information from server
Authentication.loadAuthenticationInformation(this);
if (hasAuthInformation()) {
getRequestParameters().execute(getRequestHandler());
}
}
的doWakefulWork
方法的getRequestParameters().execute(getRequestHandler());
行创建一个对象AjaxRequest
,具有沿着RequestHandler
对象,并且想法是,一旦Ajax请求完成,它就会将信息发送回RequestHandler
。
在这种情况下,处理程序是PmNotificationService
类(它扩展了WakefulIntentService
)。
的问题,因此我的问题的基础是以下消息:
12月5日至12日:09:08.139:INFO/ActivityManager(52):停止服务:com.sofurry /。服务.PmNotificationService
12月5日至12日:09:08.558:WARN /的MessageQueue(333):{处理程序} 4393e118上死线程发送消息到一个处理程序
12月5日至12日:09:08.558:WARN/MessageQueue(333):java.lang.RuntimeException:Handler {4393e118}将消息发送给处于死亡线程上的处理程序
...
显然,服务就停止,因为它已经被罚下场的要求,因为这要求在另一个线程中运行,因此本公告处理程序是死的运行。
所以我的问题是:我可以保持服务,并因此处理程序活着,直到我得到一个响应(即等待该其他线程)?如果可以的话,我更喜欢它,因为AjaxRequest对象由其他人维护,并在整个应用程序中使用。
更新
我显然错过了一个非常重要点,即从IntentService
,而不是Service
的WakefulIntentService
继承,这意味着它会自行停止它完成工作后。我目前通过稍微更改doWakefulWork
方法来解决此问题。下面是新的:
@Override
protected void doWakefulWork(Intent intent) {
RequestThread thread = null;
// Load auth information from server
Authentication.loadAuthenticationInformation(this);
if (hasAuthInformation()) {
thread = getRequestParameters().execute(getRequestHandler());
try {
thread.join();
} catch (InterruptedException ignored) {}
}
}
我不知道,如果使用thread.join()
是管理最好的办法,所以我会离开的问题没有答案了几天,我才发布一个答案,以防万一有人有更好的解决方案。