2011-05-12 102 views
1

我使用的重复警报触发一个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,而不是ServiceWakefulIntentService继承,这意味着它会自行停止它完成工作后。我目前通过稍微更改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()是管理最好的办法,所以我会离开的问题没有答案了几天,我才发布一个答案,以防万一有人有更好的解决方案。

回答

相关问题