在等待来自单独线程的响应时保持处理程序和服务活动?

时间:2011-05-12 17:30:44

标签: android wakelock

我正在使用重复闹钟触发BroadcastReceiver(OnAlarmReceiver),后者又调用WakefulIntentService.sendWakefulWork(context, PmNotificationService.class);

doWakefulWork方法显示在

下方
protected void doWakefulWork(Intent intent) {
    // Load auth information from server
    Authentication.loadAuthenticationInformation(this);

    if (hasAuthInformation()) {
        getRequestParameters().execute(getRequestHandler());
    }
}

getRequestParameters().execute(getRequestHandler());行创建了一个AjaxRequest对象以及一个RequestHandler对象,其想法是,一旦Ajax请求完成,它就会将信息发送回{ {1}}。

在这种情况下,处理程序是RequestHandler类(扩展PmNotificationService)。

问题,因此我的问题的基础是以下信息:

  

05-12 12:09:08.139:INFO / ActivityManager(52):停止服务:com.sofurry / .services.PmNotificationService

     

05-12 12:09:08.558:WARN / MessageQueue(333):处理程序{4393e118}在死线程上向处理程序发送消息

     

05-12 12:09:08.558:WARN / MessageQueue(333):java.lang.RuntimeException:Handler {4393e118}在死线程上向处理程序发送消息

     

...

显然,一旦发出请求,服务就会停止运行,因为该请求在另一个线程中运行,因此Handler已经死了。

所以我的问题是:我可以保持服务,从而处理器处于活动状态,直到我得到响应(即等待其他线程)?如果可以的话,我更喜欢它,因为AjaxRequest对象是由其他人维护的,并且在整个应用程序中使用。

更新

我显然错过了一个非常重要的观点,即WakefulIntentService继承自WakefulIntentService而不是IntentService,这意味着它会在完成后自行停止这是工作。我目前通过稍微更改Service方法解决了这个问题。这是新的:

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) {} } } 是否是管理此问题的最佳方法,所以在我发布答案之前,我会在几天之内将问题留答无法解答,以防万一有人有更好的解决方案为了它。

1 个答案:

答案 0 :(得分:0)

IntentService已经为onHandleIntent()使用了后台线程。 因此,不要使用AsyncTask - 只需在onHandleIntent()中执行代码。

检查https://groups.google.com/forum/#!topic/android-developers/YDrGmFDFUeU