1

In meiner App, wenn ich eine Push-Benachrichtigung erhalten möchte ich eine Webanforderung an den Server auslösen, um einige Daten zu aktualisieren. Dies ist meine Implementierung von IntentService.onHandleIntent(), die aufgerufen wird, wenn ich einen Push erhalten:Runnable in Handler nicht ausgeführt, wenn aus einer Push-Benachrichtigung gepostet IntentService

@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 
     } 
    }); 
} 

Es gibt keinen Grund, den Antrag in einem Runnable Lauf durch einen Handler in Einwickeln, aber die Tatsache ist, dass die runnable ausgeführt nicht. Ich habe sogar den Rückgabewert von überprüft, und es ist true. Wenn ich syncData() innerhalb einer Aktivität oder eines Fragments usw. aufruft, funktioniert es wie erwartet, aber nicht in diesem IntentService. Warum ist das?

Wenn dies tun, anstatt, funktioniert alles richtig:

public static void syncData(final Context content) { 
    // ... my web request 
} 

Antwort

3

In einem IntentService wird onHandleIntent() auf einem separaten Thread durch die IntentService erstellt aufgerufen werden. Wenn Sie also new Handler() aufrufen, wird eine Handler-Instanz für diesen neuen Thread erstellt. Wenn Sie einen Runnable unter Verwendung dieses Handlers veröffentlichen, wird dieser auf dem Handler des neuen Threads veröffentlicht und der Thread onHandleMessage wird aufgerufen, der von IntentService implementiert wird und ignoriert wird.

Wenn Sie den obigen Code ändern, wie unten es

public static void syncData(final Context content) { 
new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override public void run() { 
     // ... my web request 
    } 
}); 
} 

aber in der oben Runable auf Hauptthread aufgerufen wird funktionieren, wenn Sie nicht den Netzwerkbetrieb

+0

für Ihre ausführliche Erklärung Vielen Dank durchführen soll. Es ist jetzt klar. Vielen Dank für die Problemumgehung, aber wie du gesagt hast, kann ich dort kein Netzwerk aufbauen. Also werde ich den Handler los, wie ich bereits gezeigt habe, jedenfalls habe ich dabei etwas Neues gelernt :) –

Verwandte Themen