2014-01-13 9 views
5

Ich entwickle eine App mit RoboSpice-Bibliothek zum Aufruf von REST-APIs. Alles funktioniert gut mit der Bibliothek außer einer Sache. Ich benutze kein in RoboSpice verfügbares Caching und so werden alle Anfragen ohne Cache gestellt. Wenn jetzt eine Anfrage läuft und der Benutzer die Home-Taste drückt, wird onStop() aufgerufen, wo der Stuff() des Spice-Managers aufgerufen wird, der alle Anfragen-Listener für die Benachrichtigung auflistet. Wenn die App wieder im Vordergrund angezeigt wird, tritt keine UI-Aktualisierung auf, da die Listener nicht benachrichtigt wurden.Die Robospice-Anfrage endet nie, wenn die App im Hintergrund läuft und dann zum Vordergrund kommt?

Ich möchte keinen Cache verwenden, den Robospice anbietet. Gibt es eine andere Möglichkeit, die UI-Update-Benachrichtigungen ohne Cache zu erhalten?

Antwort

4

Mit RoboSpice ist das natürlich nicht möglich, und zwar aus einem guten Grund: Es wäre eine sehr schlechte Idee.

Wenn Ihre Aktivität stirbt (onStop), möchte Android seine Instanz abräumen. Und um es zu tun, sollte es von nichts referenziert werden. Deshalb schreibt RS vor, dass alle Listener entfernt werden. In der Regel enthalten Listener einen Verweis auf die Aktivität (als innere Klassen), und die beste Leistung von RS besteht darin, die Aktivität ordnungsgemäß ablaufen zu lassen und Müll zu sammeln.

Also, das zu tun, was Sie wollen, würde eindeutig zu einem Speicherleck führen, und würde außerdem die meiste Zeit zum Absturz führen: Wenn eine Aktivität nicht mehr angezeigt wird, möchten Sie ihre Benutzeroberfläche aktualisieren? Sieht ein bisschen nach hinten aus, nicht wahr?

Vielleicht am einfachsten wäre es, einen sehr begrenzten Cache zu verwenden, oder einfach alle Ihre Anfragen auszuführen, sobald Ihre Aktivitäten in onStart eintreten.

+1

Ich stimme zu, dass RS tut es aus einem Grund. Stellen Sie sich jedoch vor, dass eine Anfrage gestellt wurde und der Fortschrittsdialog angezeigt wird und der Benutzer die Home-Taste drückt. Der Aufruf von REST wird ordnungsgemäß ausgeführt. Wenn der Benutzer die App startet, wurde der Fortschrittsdialog nicht angezeigt, da die Benutzeroberfläche nicht aktualisiert wurde, da Listener nicht registriert wurden. Wie auch immer, es scheint, dass die Verwendung von Cache zur Zeit der einzige Weg mit RS ist. – mobiledev

+0

Der andere Weg kann spiceManager.shouldStop() in onDestroy aufrufen und den spicemanager in onCreate() starten. Als onDestroy() ist der letzte Aufruf, den eine Aktivität erhält, wenn sie getötet wird. – mobiledev

+0

@mobiledev, ich glaube nicht, dass die zweite Lösung besser ist. Service-Binding ist wirklich schwierig und der bevorzugte Ort ist, das Paar onStart/onStop zu verwenden. Möglicherweise möchten Sie die Anforderung von einem Dienst anstelle einer Aktivität ausführen. – Snicolas