Wie behandeln Sie Handler-Nachrichten, wenn Aktivität / Fragment angehalten ist
Leichte variation auf meinem andere posten
Im Grunde habe ich eine Nachricht Handler
in meinem Fragment
der erhält eine Reihe von Nachrichten, die entstehen können, in Dialogen wird entlassen oder angezeigt werden.
Wenn die app in den hintergrund bekomme ich eine onPause
dann doch noch bekommen, meine Botschaften, die durchkommen, als man erwarten würde. Allerdings, denn ich bin mit Fragmenten, die ich kann nicht einfach entlassen und show-Dialogen, die in einer IllegalStateException
.
Ich kann nicht einfach entlassen oder kündigen, so dass Status-Verlust.
Gegeben, dass ich eine Handler
ich Frage mich, ob es eine empfohlene Vorgehensweise als zu
wie ich das behandeln soll, die Nachrichten, während in einem angehaltenen Zustand.
Eine mögliche Lösung, die ich bin Betrachtung ist zur Aufzeichnung der Botschaften, die durchkommen, während Sie pausiert und spielen Sie Sie zurück auf eine onResume
. Dies ist etwas unbefriedigend, und ich denke, dass es muss etwas in dem Rahmen zu behandeln, diese mehr elegant.
Vielen Dank im Voraus. Peter.
InformationsquelleAutor der Frage PJL | 2011-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl das Android-Betriebssystem nicht angezeigt wird, um einen Mechanismus besitzen, der ausreichend behandelt Ihr problem, ich glaube, dieses Muster bietet eine vergleichsweise einfach zu implementieren Abhilfe.
Die folgende Klasse ist ein wrapper um
android.os.Handler
dass Puffer-up-Nachrichten, wenn eine Aktivität ist angehalten und spielt Sie wieder auf fortsetzen.Sicherzustellen, dass alle code, den Sie haben, die asynchron die änderungen, die ein fragment Zustand (z.B. commit, entlassen) wird nur aufgerufen, aus einer Nachricht in der Prozedur.
Leiten Sie Ihre handler von den
PauseHandler
Klasse.Wenn Ihre Tätigkeit erhält eine
onPause()
nennenPauseHandler.pause()
und füronResume()
nennenPauseHandler.resume()
.Ersetzen Sie Ihre Implementierung der Handler
handleMessage()
mitprocessMessage()
.Bieten eine einfache Umsetzung von
storeMessage()
die immer zurücktrue
.Unten ist ein einfaches Beispiel, wie die
PausedHandler
- Klasse verwendet werden.Auf dem klicken einer Taste eine verzögerte Nachricht an den handler.
Wenn der handler die Nachricht erhält (auf dem UI-thread) zeigt es eine
DialogFragment
.Wenn die
PausedHandler
- Klasse nicht, wird eine IllegalStateException wäre angezeigt, wenn die home-Taste wurde gedrückt, nach betätigung der test-Taste, um das Dialogfeld öffnen.Ich habe ein
storeMessage()
Methode, um diePausedHandler
Klasse, im Falle von Nachrichten sollten sofort verarbeitet werden, auch wenn die Aktivität angehalten wird. Wenn eine Nachricht behandelt wird, dann wird false zurückgegeben werden soll und die Nachricht wird verworfen.InformationsquelleAutor der Antwort quickdraw mcgraw
Einen etwas einfacheren version von quickdraw ausgezeichnete PauseHandler ist
Er geht davon aus, dass Sie immer wollen, zum speichern von offline-Nachrichten für die Wiedergabe. Und bietet die Tätigkeit als Eingang zu
#processMessages
so brauchen Sie nicht, es zu leiten in die sub-Klasse.InformationsquelleAutor der Antwort William
Hier ist eine etwas andere Herangehensweise an das problem zu tun, Fragment verpflichtet, in eine callback-Funktion, und vermeiden Sie die IllegalStateException-Problem.
Erstellen Sie zunächst eine benutzerdefinierte runnable-Schnittstelle.
Als Nächstes erstellen Sie ein fragment für die Bearbeitung der MyRunnable Objekte. Wenn die MyRunnable-Objekt erstellt wurde, nach der die Aktivität angehalten wurde, z.B. wenn der Bildschirm gedreht wird, oder der Benutzer drückt die home-Taste, wird es in eine Warteschlange zur späteren Bearbeitung mit einem neuen Kontext. Die Warteschlange überlebt alle änderungen an der Konfiguration, weil setRetain-Instanz auf true gesetzt ist. Die Methode runProtected läuft auf den UI-thread zu vermeiden, eine race-condition bei der isPaused Flagge.
Schließlich das fragment kann verwendet werden, eine Haupt-Anwendung wie folgt:
InformationsquelleAutor der Antwort Rua109
In meinen Projekten verwende ich die observer-design-pattern zu lösen. In Android -, broadcast-Receiver und Absichten sind eine Implementierung dieses Musters.
Was ich tun müssen, ist erstellen Sie eine BroadcastReceiver denen ich mich in fragment/activity onResume und aufheben der Registrierung in fragment/activity onPause.
In BroadcastReceiver's Methode onReceive ich die ganzen code, der ausgeführt werden muss, als Ergebnis der BroadcastReceiver - Empfang eines Intent(Nachricht) geschickt wurde, um Ihre app im Allgemeinen. Zur Erhöhung der Selektivität auf, welche Art von intents, die Ihr fragment erhalten können, können Sie verwenden Sie ein Vorsatz-filter, wie im Beispiel unten.
Vorteil dieses Ansatzes ist, dass die Absicht(message) gesendet werden können von überall innerhalb Ihrer app(ein dialog, der geöffnet auf der Oberseite des fragments, eine asynchrone Aufgabe, ein weiteres fragment, etc.). Die Parameter können sogar übergeben als Vorsatz extras.
Ein weiterer Vorteil ist, dass dieser Ansatz ist kompatibel mit jedem Android-API version, da BroadcastReceivers und Absichten eingeführt wurden, auf API-Ebene 1.
Ihre sind nicht erforderlich, keine setup-spezielle Berechtigungen auf app-manifest-Datei, außer wenn Sie planen, zu verwenden sendStickyBroadcast(wo Sie brauchen, um hinzuzufügen, BROADCAST_STICKY).
InformationsquelleAutor der Antwort dangel