Drawable vs Unique réutilisable Bitmap mieux avec de la mémoire?
Si je comprends bien (pas que je suis correct) un drawable sont généralement correctement supprimé de la mémoire lorsque l'application est terminée avec eux. Les Bitmaps doivent cependant être manuellement recyclé, et parfois même une classe spéciale écrite de les manipuler correctement. Ma question est, en ce qui concerne la mémoire et les fuites, est-il plus avantageux de simplement coller avec un drawable comme tel:
myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));
plutôt que quelque chose comme ça avec les Bitmaps:
Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
myView.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1);
myView1.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2);
myView2.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
J'ai aussi lu bien sûr que vous devez être prudent au sujet de recyclage() la méthode sur des Bitmaps, car ils peuvent être retirés pendant encore en usage? Il semble que ces questions de garder popping up dans différentes formes, mais je ne peux pas vraiment obtenir une réponse directe à partir de tous sur la question. Une personne dit à la réutilisation d'une image Bitmap et recycler après chaque utilisation, et d'autres disent utiliser un drawable et un unbindDrawables (), méthode (c'est ce que j'ai utilisé):
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Applicables insight serait très apprécié si. Grâce
Vous devez vous connecter pour publier un commentaire.
Je reviens Romain de la proposition, mais je ne suis pas sûr que votre question est de résoudre votre problème. Je ne sais pas comment vous gérer les références de votre point de Vue. Peut-être que vous avez simplement des fuites de mémoire dans votre application? Beaucoup de fuites de mémoire dans Android sont liées à
Context
. Lorsqu'unDrawable
est attaché à unView
, leView
est défini comme un rappel sur laDrawable
.Dans l'extrait de code ci-dessus, cela signifie que le
Drawable
a une référence à laTextView
qui a lui-même une référence à laActivity
(leContext
) qui à son tour a des références à peu près n'importe quoi en fonction de votre code.Sans regarder plus de votre code, je suppose que vous êtes sur la bonne voie en définissant la stockées un drawable' rappels à
null
lorsqu'unActivity
est détruit.Bitmaps ne pas besoin manuellement recyclé. Ils sont des ordures collectées comme un drawable et d'autres objets. De même, vous n'avez pas besoin de séparer un drawable, sauf dans des situations très spécifiques. Il semble que vous avez lu beaucoup d'informations trompeuses.
De recyclage de bitmaps et de déliaison drawable peut être utile dans certaines situations (par exemple, si votre application manipuler de grandes quantités de données bitmap ou si vous stockez dessinés d'une manière statique.)
Les deux exemples vous montrent au début de votre question sont équivalentes. Si vous chargez un drawable directement, les bitmaps sera chargé sur votre compte. Si vous chargez des bitmaps manuellement et de les fixer sur une ImageView, ils seront enfermés dans un drawable sur votre nom.
Utiliser la première solution car elle est plus simple et ne vous inquiétez pas à propos de la déliaison et de la mémoire d'autres techniques de gestion jusqu'à ce que vous réellement besoin d'eux.