在我的应用程序中,当我收到推送通知时,我想向服务器发送Web请求以更新某些数据。这是我IntentService.onHandleIntent()
的实现,当我收到推送时调用它:
@Override protected void onHandleIntent(Intent intent) {
final NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
final NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
// ... notification setup
notificationManager.notify(Integer.parseInt(intent.getStringExtra("id")), notificationBuilder.build());
// Web request to the server to update data
syncData(this);
// Release the wake lock provided by the WakefulBroadcastReceiver.
PushNotificationsReceiver.completeWakefulIntent(intent);
}
public static void syncData(final Context content) {
new Handler().post(new Runnable() {
@Override public void run() {
// ... my web request
}
});
}
没有理由在Handler的Runnable运行中包装请求,但事实是runnable没有运行。我甚至检查了post()
及其true
的返回值。如果我从活动或片段等中调用syncData()
,它会按预期工作,但不会在此IntentService
中工作。 为什么?
如果这样做,一切正常:
public static void syncData(final Context content) {
// ... my web request
}
答案 0 :(得分:3)
在IntentService
中,onHandleIntent()
将在IntentService
创建的单独线程上调用。因此,当您调用new Handler()
时,将为该新线程创建一个处理程序实例。当您使用该处理程序发布runnable时,它将被发布在新线程的处理程序上,并且将调用由onHandleMessage
实现的线程IntentService
,并将其忽略。
如果你修改上面的代码,它将起作用
public static void syncData(final Context content) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override public void run() {
// ... my web request
}
});
}
但是上面的Runable
将在不应该执行网络操作的主线程上调用