6

In einigen meiner Apps verwende ich ein paar Singleton-Objekte als "Manager". Ich instanziiere sie in Application.onCreate und ich gebe ihnen die ApplicationContext, die ich in einem WeakReference speichern.Android Context Weak Reference

Einige der starten, nachdem eine Hintergrundaufgabe Methoden „Manager“ von einem Activity aufgerufen wird, so gebe ich die Activity ‚s context dem Verfahren, und auch eine WeakReference halten, dass (und verwenden Sie diese innerhalb eines AsyncTask). Dieser Verweis wird beibehalten, bis ein Activity das nächste Mal eine Methode aufruft, die in den Hintergrund tritt, wenn WeakReference auf context des neuen gesetzt wird.

Meine Frage ist, funktioniert die ApplicationContext in einem WeakReference gehalten werden müssen, und gibt es irgendwelche Probleme der Activity ‚s context wie das mit dem Halten?

Antwort

9

Der Grund für die Beibehaltung eines WeakReference im Kontext der Aktivität ist, dass Sie keinen Verweis auf eine Activity behalten, die bereits zerstört wurde oder anderweitig zerstört werden sollte. Kein solches Problem existiert für die Application. Ein WeakReference ist in diesem Fall nicht notwendig.

Es ist schwierig, Ihre Verwendung des Kontexts der Aktivität zu kommentieren, da Sie nicht genau beschrieben haben, wofür Sie sie genau verwenden. Es klingt ein wenig verdächtig, dass Sie den Kontext für verschiedene Aktivitäten austauschen. Wenn Sie wirklich den Kontext einer bestimmten Aktivität benötigen, ist dies möglicherweise in Ordnung, aber wenn Sie einfach eine gültige Context mit einer AsyncTask verwenden möchten, würde ich überdenken, Ihren Ansatz zu überdenken. Es wird wahrscheinlich funktionieren, aber es ist ein bisschen hacky. Es gibt andere Optionen, die je nach Ihren Anforderungen besser geeignet sind: IntentService und Loaders sind Optionen, die Sie berücksichtigen sollten.

+0

Ich habe den Eindruck, dass Sie eine 'Activity'' Context' in einer AsyncTask verwenden müssen. Täusche ich mich? Gibt es eine Situation, in der 'ApplicationContext' nicht verwendet werden kann? Wenn nicht, würde ich lieber zum 'ApplicationContext' wechseln (würde mir das Leben leichter machen). – Eliezer

+0

Nur eine Ergänzung zu oben, von dem, was ich weiß, ein 'ApplicationContext' sollte nicht verwendet werden, wenn eine' Ansicht' instanziiert wird. Ist das korrekt? – Eliezer

5

Im Allgemeinen müssen Sie den Anwendungskontext nicht in einer WeakReference beibehalten. Sie sollten jedoch andere Arten von Kontexten in einer WeakReference behalten.