我正在使用重复闹钟触发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) {}
}
}
是否是管理此问题的最佳方法,所以在我发布答案之前,我会在几天之内将问题留答无法解答,以防万一有人有更好的解决方案为了它。
答案 0 :(得分:0)
IntentService已经为onHandleIntent()使用了后台线程。 因此,不要使用AsyncTask - 只需在onHandleIntent()中执行代码。
检查https://groups.google.com/forum/#!topic/android-developers/YDrGmFDFUeU