Les gestionnaires et les fuites de mémoire dans Android
Regardez le code ci-dessous:
public class MyGridFragment extends Fragment{
Handler myhandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case 2: {
ArrayList<HashMap<String,String>> theurls = (ArrayList<HashMap<String,String>>) message.obj;
urls.addAll(theurls);
theimageAdapter.notifyDataSetChanged();
dismissBusyDialog();
break;
}}}};
}
Lorsque j'utilise le gestionnaire comme cela, je reçois un avertissement "gestionnaire doit être statique, sinon elle est sujette à des fuites de mémoire." Quelqu'un peut-il me dire quelle est la meilleure façon de le faire?
- Je ne suis pas convaincu que vous êtes en utilisant le virage correctement. Jetez un oeil à ce guide: vogella.com/articles/AndroidPerformance/article.html. Ses pas déclaré comme statique dans l'exemple de code là. :/
- Eh bien, même en l'utilisant comme ça me donne la même erreur. Ce n'est jamais utilisé pour arriver plus tôt jusqu'j'ai mis à jour mon android sdk de la nuit dernière. Déclarant simplement un gestionnaire comme une variable de classe apparaît cette charpie avertissement maintenant
- Eh bien que diriez-vous simplement déclarer votre gestionnaire de statique?
- Eh bien, je me réfère à la non-statiques, des objets à l'intérieur du gestionnaire
- Découvrez ce blog pour une analyse plus approfondie
Vous devez vous connecter pour publier un commentaire.
J'ai récemment mis à jour quelque chose de similaire dans mon propre code. Je viens de faire l'anonyme de la classe de Gestionnaire d'un protégé de l'intérieur de la classe et de la Charpie avertissement s'en alla. Voir si quelque chose comme le code ci-dessous va travailler pour vous:
Vous pouvez avoir à changer où j'ai mis "theFrag." comme je ne pouvais que deviner ce que ceux qui sont référencés.
Ici est un peu petite classe utile j'ai fait que vous pouvez utiliser. C'est malheureusement encore assez détaillé parce que vous ne pouvez pas avoir anonymes statique à l'intérieur des classes.
Par la ADT 20 Changements, il semble que vous devriez en faire de l'électricité statique.
Si vous lisez les docs sur AccountManager ou PendingIntent, vous verrez que certaines méthodes prennent Gestionnaire comme l'un des arguments.
Par exemple:
Imaginer la situation. Certains d'Activité des appels PendingIntent.envoyer(...) et de mettre la non-statique intérieure sous-classe de Gestionnaire. Et puis l'activité est détruite. Mais à l'intérieur de la classe des vies.
Intérieur de la classe elle détient toujours un lien vers détruit activité, il ne peut pas être récupérées.
Si vous n'avez pas l'intention d'envoyer à votre gestionnaire de telles méthodes, vous n'avez rien à craindre.
Je rencontre le même problème et je trouve que c'est un de ces sujets avec beaucoup de questions et peu de answeres. Ma solution est simple et j'espère que cela peut aider quelqu'un:
Nous pouvons créer un Gestionnaire statique sous-classe qui fonctionne simplement un Exécutable. Le gestionnaire réel exemple de savoir quoi faire par le biais de l'exécutable qui auront accès à des variables d'instance.
L'avertissement est allé tandis que la fonctionnalité est la même.
Une solution simple pour ce cas, peut-être: