从推送通知IntentService内部发布时,Handler中的Runnable不会运行

时间:2017-02-24 11:21:05

标签: android push-notification intentservice android-handler

在我的应用程序中,当我收到推送通知时,我想向服务器发送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
}

1 个答案:

答案 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将在不应该执行网络操作的主线程上调用