Je suis développeur java depuis 2 ans.
Mais je n'ai jamais écrit de WeakReference dans mon code. Comment utiliser WeakReference pour rendre mon application plus efficace en particulier l'application Android?
java
android
weak-references
Chris
la source
la source
Réponses:
Utiliser un
WeakReference
dans Android n'est pas différent de celui en utilisant un dans l'ancien Java. Voici un excellent guide qui donne une explication détaillée: Comprendre les références faibles .Vous devriez penser à en utiliser un chaque fois que vous avez besoin d'une référence à un objet, mais vous ne voulez pas que cette référence protège l'objet du garbage collector. Un exemple classique est un cache que vous souhaitez récupérer lorsque l'utilisation de la mémoire devient trop élevée (souvent implémenté avec
WeakHashMap
).Assurez-vous de vérifier
SoftReference
etPhantomReference
aussi.EDIT: Tom a soulevé quelques inquiétudes concernant l'implémentation d'un cache avec
WeakHashMap
. Voici un article exposant les problèmes: WeakHashMap n'est pas un cache!Tom a raison de dire qu'il y a eu des plaintes concernant les mauvaises performances de Netbeans en raison de
WeakHashMap
mise cache.Je pense toujours que ce serait une bonne expérience d'apprentissage d'implémenter un cache avec
WeakHashMap
, puis de le comparer à votre propre cache mis en œuvre à la main avecSoftReference
. Dans le monde réel, vous n'utiliseriez probablement aucune de ces solutions, car il est plus logique d'utiliser une bibliothèque tierce comme Apache JCS .la source
WeakHashMap
utilisé comme cache est fatal. Les entrées peuvent être supprimées dès leur création. Cela ne se produira probablement pas lorsque vous testez, mais peut très bien être utilisé. Il est à noter que NetBeans peut être amené à un arrêt effectif à 100% du processeur par cela.WeakHashMap
même si vous avez raison de dire que c'est un mauvais choix;)[EDIT2] J'ai trouvé un autre bon exemple de
WeakReference
. Traitement des bitmaps en dehors de la page de thread de l'interface utilisateur dans le guide de formation Afficher efficacement les bitmaps , montre une utilisation deWeakReference
dans AsyncTask.Ça dit,
Bon codage!
[EDIT] J'ai trouvé un très bon exemple de
WeakReference
de facebook-android-sdk . La classe ToolTipPopup n'est rien d'autre qu'une simple classe de widget qui affiche une info-bulle au-dessus de la vue d'ancrage. J'ai pris une capture d'écran.La classe est vraiment simple (environ 200 lignes) et mérite d'être regardée. Dans cette classe,
WeakReference
classe est utilisée pour contenir une référence à la vue d'ancrage, ce qui est parfaitement logique, car elle permet à la vue d'ancrage d'être récupérée même lorsqu'une instance d'info-bulle vit plus longtemps que sa vue d'ancrage.Bon codage! :)
Permettez-moi de partager un exemple pratique de
WeakReference
classe. C'est un petit extrait de code du widget du framework Android appeléAutoCompleteTextView
.En bref, la
WeakReference
classe est utilisée pour contenir unView
objet afin d'éviter une fuite de mémoire dans cet exemple.Je vais simplement copier-coller la classe PopupDataSetObserver, qui est une classe imbriquée de
AutoCompleteTextView
. C'est vraiment simple et les commentaires expliquent bien la classe. Bon codage! :)Et le
PopupDataSetObserver
est utilisé dans l'adaptateur de réglage.Une dernière chose. Je voulais également connaître des exemples de travail
WeakReference
dans une application Android, et j'ai pu trouver des exemples dans ses exemples d'applications officiels. Mais je ne pouvais vraiment pas comprendre l'utilisation de certains d'entre eux. Par exemple, les applications ThreadSample et DisplayingBitmaps utilisentWeakReference
dans son code, mais après avoir exécuté plusieurs tests, j'ai découvert que la méthode get () ne retourne jamaisnull
, car l'objet de vue référencé est recyclé dans les adaptateurs, plutôt que collecté.la source
Certaines des autres réponses semblent incomplètes ou trop longues. Voici une réponse générale.
Comment utiliser WeakReference en Java et Android
Vous pouvez suivre les étapes suivantes:
WeakReference
variableCode
MyClass
a une faible référence àAnotherClass
.AnotherClass
a une forte référence àMyClass
.Remarques
MyClass
était A etAnotherClass
était B.WeakReference
consiste à demander à une autre classe d'implémenter une interface. Ceci est fait dans le modèle Listener / Observer .Exemple pratique
la source
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
objet lui-même endoSomething
fonction pour ne pas êtrenull
avant d'appelerget
function.Un mappage «canonisé» est l'endroit où vous gardez une instance de l'objet en question en mémoire et que toutes les autres recherchent cette instance particulière via des pointeurs ou un tel mécanisme. C'est là que les références faibles peuvent aider. La réponse courte est que les objets WeakReference peuvent être utilisés pour créer des pointeurs vers des objets dans votre système tout en permettant à ces objets d'être récupérés par le ramasse-miettes une fois qu'ils sont hors de portée. Par exemple, si j'avais un code comme celui-ci:
Tout objet que j'enregistre ne sera jamais récupéré par le GC car il y a une référence à celui-ci stockée dans l'ensemble de
registeredObjects
. D'un autre côté si je fais ceci:Ensuite, lorsque le GC voudra récupérer les objets de l'ensemble, il pourra le faire. Vous pouvez utiliser cette technique pour la mise en cache, le catalogage, etc. Voir ci-dessous pour des références à des discussions beaucoup plus approfondies sur GC et la mise en cache.
Réf: Garbage collector et WeakReference
la source