2013-09-25 12 views
10

Ich bin auf der Suche nach einer technischen Antwort, wie die Android-Robospice-Bibliothek den Aktivitätszyklus verwaltet. Von der Begleit-Seite.Wie verwaltet Robospice den Aktivitätszyklus?

https://github.com/octo-online/robospice/wiki/Starter-Guide

„Als innere Klasse Ihrer Aktivität (oder einem anderen Kontext), eine RequestlListener hinzufügen, die die Benutzeroberfläche aktualisieren Kümmere dich nicht um Speicherlecks, verwaltet RoboSpice Ihre Tätigkeit des Lebenszyklus."

Meine Frage ist, wie Robospice automatisch die Anfrage Listener aktualisiert, so dass es immer noch in der Lage ist, den richtigen Listener mit dem richtigen Kontext nach einer Rotation und nachdem die Aktivität zerstört und als neue Instanz neu erstellt wurde?

Ich habe versucht, den Quellcode Reverse Engineering haben, aber noch keine Antwort gefunden:

https://github.com/octo-online/robospice

Antwort

9

@ Chancen annehmen Machen Cha. Was Sie sagen, ist genau richtig. RS wurde mit diesem ausdrücklichen Bedürfnis entwickelt: Verwaltung von Netzwerkanfragen und Lebenszyklen von Aktivitäten.

@ craigrs84. Was mit RS passiert, ist im Grunde, dass, wenn eine Anfrage verarbeitet wird, ihre Listener aufgerufen werden, solange die zugehörige Aktivität aktiv ist. Wenn die Aktivität nicht mehr aktiv ist, werden alle Zuhörer von der RS ​​getrennt, und sie werden nicht benachrichtigt. Der Hauptzweck von RS besteht darin, sicherzustellen, dass es keinen Speicherleck gibt: Ihre Aktivität, wenn sie sterben muss, wird absterben und Müll gesammelt werden, RS enthält keinen harten Verweis darauf, der Müll verhindern würde Sammlung. Das ist wirklich die Kernidee hinter RoboSpice.

Wenn Sie möchten, dass eine neue Instanz Ihrer Aktivität in eine ausstehende Anforderung repliziert wird (z. B. wenn Sie eine Anforderung ausführen, dann das Gerät drehen und dann eine neue Instanz Ihrer Aktivität abrufen und diese neue Instanz empfangen soll Ergebnis der Anforderung, die von der vorherigen Instanz ausgeführt wurde), das ist mit RS möglich.

Verwenden Sie in einem solchen Fall die Methode spiceManager.addListenerIfPending im Start, direkt nach dem Aufruf von spiceManager.start (..). Dadurch wird keine neue Anforderung ausgeführt, aber ein neuer Listener wird erneut an eine ausstehende Anforderung angehängt. Wenn keine Anfrage ansteht, wird nichts unternommen.

+0

Wenn Sie also keinen requestCacheKey bereitstellen und mehrere Instanzen derselben Aktivität zur gleichen Zeit ausgeführt werden, funktioniert addListenerIfPending weiterhin ordnungsgemäß? Oder gibt es in diesem Fall nicht genügend Informationen? Dies ist wahrscheinlich ein unwahrscheinliches Szenario, aber ich bin neugierig. – craigrs84

+0

@snicolas, ich bin neugierig, wenn Sie nicht aufrufen, sollteStop() (oder die nicht-asynchrone Methode) ruft die Bibliothek nicht zu diesen Listenern für Aktivitäten, Fragmente, Services, etc? Ohne zu viel durch die Quelle zu graben und basierend auf meiner frühen Nutzung und dem Testen Ihrer Bibliothek, würde ich eine Ausnahme erhalten, wenn ich einen Rückruf zu einem Objekt bekommen hätte, das "gestorben" war. Auch die Bibliothek ist großartig, bitte mach weiter so! – AllDayAmazing

+0

Wenn Sie nicht sustopStop aufrufen, werden Listener ausgelöst. Dies kann zu Abstürzen und Speicherlecks führen, da Listener oft innere Klassen sind und einen Verweis auf eine Aktivitätsinstanz enthalten, die zerstört worden wäre, und sie kann sogar abstürzen, wenn Sie beispielsweise in Ihren Listenern ViewVieById finden. Ich denke du hast es verstanden, wollte nur klarstellen. – Snicolas

2

Die kurze Antwort, aus meiner Erfahrung ist, dass es nicht.

Wenn Sie beispielsweise SpiceManager.shouldStop() nicht anrufen und eine Anfrage ausführen, wird der Verweis auf den RequestListener trotzdem beibehalten und Sie können einen Speicherverlust feststellen, wenn er versucht, das darin referenzierte Objekt zu aktualisieren. Fragment/Service existiert nicht mehr.

+0

Sorry, aber nein, es gibt keinen Speicherverlust in RS mit Zuhörern. Sie werden entfernt und Müll wird direkt in sustainStop gesammelt. – Snicolas