2017-05-24 5 views
0

Here, in this answerActivity Instanz zu speichern, die in WeakReference<Activity> Variable gespeichert wird. So wird es vermeiden Speicherlecks. Ist es eine gute Übung, dies zu tun?Ist es eine gute Praxis, die Aktivitätsinstanz in einer WeakReference

public class BackgroundService extends IntentService { 
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) { 
     mActivityRef = new WeakReference<>(activity); 
    } 
} 

Ich verwende mActivityRef.get() und es erforderlich Aktivitätsobjekt Gießen. Mit diesem Objekt auf die Methoden in Aktivität zugreifen.

Der Zweck ist, Aktivität Methoden von Dienst zuzugreifen, dieser Code macht die Arbeit aber nach den Kommentaren Ich bin verwirrt, ob es zu benutzen oder nicht

Ich habe die document noch nicht klar bezeichnet.

Antwort

2

Ist es eine gute Übung, dies zu tun?

Nr

Der Zweck ist, aus dem Dienst Aktivität Methoden für den Zugriff auf

Diese Tätigkeit kann nicht existieren. Zum Beispiel könnte der Benutzer ZURÜCK drücken und die Aktivität zerstören, während der Dienst läuft. Der Aufruf von Methoden bei einer zerstörten Aktivität führt wahrscheinlich zu Abstürzen.

Verwenden Sie einen Ereignisbus (LocalBroadcastManager, greenrobot's EventBus usw.) für lose gekoppelte Kommunikation zwischen Komponenten, z. B. zwischen Diensten und Aktivitäten. Lassen Sie die Aktivität für Ereignisse registrieren, wenn sie sichtbar sind, und lassen Sie die Ereignisse nach Bedarf von den Diensten posten.

+0

Ich habe implementiert [LocalBroadcastManager] (https://Stackoverflow.com/a/25172526/2820534) es macht die Aufgabe, aber können wir dieser Sendung vertrauen? Wird das immer angesprochen ?? – Prabs

+0

@ Prabs: Ich weiß nicht, was Sie mit "Vertrauen Sie dieser Sendung" oder "immer angesprochen werden". Per Definition ist möglicherweise nichts für ein Ereignis registriert. In diesem Fall kann der Dienst dies jedoch herausfinden und andere Schritte unternehmen. Sie können beispielsweise eine lokale Übertragung senden. Wenn Sie keine Vordergrundbenutzeroberfläche haben, die das Ereignis abruft, kann der Dienst stattdessen eine Benachrichtigung auslösen. Siehe [diese Beispielanwendung] (https://github.com/commonsguy/cw-omnibus/tree/v8.5/EventBus/LocalBroadcastManager). – CommonsWare

0

Nein es ist nicht eine gute Praxis, eine Referenz von Activity überall in Ihrem Projekt zu speichern, aber wenn Sie nicht möchten, erstellen Sie eine interface Ihre Aktivität mit Schnittstelle implementieren und die Schnittstelle als Kommunikationsweg zwischen Aktivität und IntentService zu Ihren Diensten passieren .

Jetzt hat Ihr Dienst einen Verweis auf die (ausgewählten) Methoden Ihrer Aktivität. Greifen Sie über diese Schnittstelle auf Ihre Daten zu und löschen Sie die Referenz nach ihrer Verwendung.

Verwandte Themen