Ich habe jetzt versucht, das Anliegen von @ kyle-ivey dahingehend zu adressieren, dass Antworten zwischen onPause()
und onResume()
verworfen werden. Dies ist ein echtes Problem, wie ich es in einer Live-Anwendung erlebt habe.
Mein Ansatz baut auf dem Ereignisbusmuster auf, das in der Antwort von Thomas Moerman implementiert wurde, obwohl ich eine Beispielanwendung von Grund auf neuimplementiert habe. Es hängt von der Otto Event bus Library, Gson und Volley. Es wird in IntelliJ 13 Ultimate mit Maven Tom implementiert, um die Abhängigkeiten aufzulösen.
Lösung: Ich füge zu den vorherigen Antworten eine Klasse hinzu, die als ein HTTP-Antwortpuffer fungiert, der die Verantwortung übernimmt, Ereignisse zuzuhören, während die Aktivität übergeht. Wenn dies erledigt ist, fragt die Aktivität aktiv nach Antworten, die möglicherweise eingetroffen sind, während die Aktivität auf den Ereignisbus getrennt wurde. Es hakt an/aus in den und onResume
-Veranstaltungen neben dem Ereignis-Bus Registrierung in einer Art und Weise wie folgt aus:
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
Hier ist die Implementierung von the ResponseBuffer-class.
Caveat 1: Wenn die Aktivität nicht wieder aufgenommen wird, und weder stopAndProcess()
noch stopAndPurge()
wird in einer zukünftigen Tätigkeit der Puffer kann eine Quelle des Speicherverlustes genannt. Sei dir bewusst, wie du es benutzt. Ein sicheres Muster wäre stopAndProcess()
in onResume()
in alle Ihrer Aktivitäten zu haben.
Vorbehalt 2: Es ist nicht Thread-sicher. Wenn ein Kontextwechsel zwischen der Zeile, in der das Speichern gespeichert wird, und der Registrierung des Ereignisbusses stattfindet, kann das Ereignis zweimal oder null Mal empfangen werden.
Das Beispiel enthält einige Testcode in Form von UI und Support-Klassen, aber die wichtigsten Klassen würden Sie brauchen, wenn Sie dieses Muster in einem separaten Projekten nutzen wollen, sind diejenigen, die in den folgenden Paketen:
- nilzor.ottovolley.core
- nilzor.ottovolley.messages
Siehe github-Repository OttoVolleyDoneRight für ein komplettes Beispiel mit UI zum Testen.
"Wie bekomme ich die Antwort für diese Anfrage, oder wie stelle ich eine Verbindung zu ihr her, wenn sie noch aussteht?" - Nur weil Ihre App nicht mehr im Vordergrund ist, können Threads nicht ausgeführt werden. Was lässt Sie denken, dass die "Anfrage" Ihnen noch nicht zugestellt wurde? Verwenden Sie ein beibehaltenes Fragment für asynchrone Operationen, so dass Ihre asynchronen Operationen unabhängig von den Orientierungsänderungen eine stabile Basis für die Kommunikation haben. – CommonsWare
Aus irgendeinem Grund hatte ich den Eindruck, dass 'Volley' keine Antworten liefert, wenn wir in den Hintergrund gehen (wie' Robospice'), aber Sie haben Recht. Wir müssen 'requestQueue.cancel (...)' aufrufen, um die Zustellung zu stoppen. Ich denke immer noch an eine nette, einfache Art und Weise, wie ich Antworten während "stop/resume" richtig wiedergeben kann. –