android - example - layer list background color
¿Drawable vs Single Reutilizable Bitmap mejor con memoria? (2)
Como lo entiendo (no que sea correcto) los Drawables generalmente se eliminan correctamente de la memoria cuando la aplicación termina con ellos. Sin embargo, los mapas de bits deben ser reciclados manualmente, y algunas veces incluso se puede escribir una clase especial para manejarlos correctamente. Mi pregunta es, en lo que respecta a la memoria y las fugas, ¿es más beneficioso simplemente quedarse con Drawables como tales:
myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));
En lugar de algo así con 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();
También he leído, por supuesto, que debe tener cuidado con el método de reciclaje () en los mapas de bits, ya que pueden eliminarse mientras aún están en uso. Parece que estos problemas siguen apareciendo en diferentes formas, pero realmente no puedo obtener una respuesta directa de nadie al respecto. Una persona dice que reutilice un Bitmap y recicle después de cada uso, y otros dicen que usa Drawables y un método unbindDrawables () (esto es lo que he estado usando):
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();
}
}
Sin embargo, cualquier idea aplicable sería muy apreciada. Gracias
Los mapas de bits no necesitan ser reciclados manualmente. Son basura recolectada al igual que los objetos dibujables y otros. Del mismo modo, no es necesario desvincular los objetos dibujables, excepto en situaciones muy específicas. Parece que lees mucha información engañosa.
Reciclar los mapas de bits y desenlazar los dibujos puede ser útil en algunas situaciones (por ejemplo, si su aplicación manipula grandes cantidades de datos de mapas de bits o si almacena los dibujos de forma estática).
Los dos ejemplos que muestra al comienzo de su pregunta son equivalentes. Si carga un dibujo directamente, los mapas de bits se cargarán en su nombre. Si carga los mapas de bits manualmente y los configura en un ImageView, estos se incluirán en los dibujables en su nombre.
Use la primera solución, ya que es más simple y no se preocupe por la desvinculación y otras técnicas de administración de memoria hasta que realmente las necesite.
Respaldo la propuesta de Romain, pero no estoy seguro de que su pregunta aborde su problema real. No sé cómo manejas las referencias a tus Vistas. Tal vez simplemente tiene fugas de memoria en su aplicación? Muchas fugas de memoria en Android están relacionadas con el Context
. Cuando un Drawable
se adjunta a una View
, la View
se establece como una devolución de llamada en el Drawable
.
TextView myView = new TextView(this);
myView.setBackgroundDrawable(getDrawable(R.drawable.my_bitmap));
En el fragmento de código anterior, esto significa que Drawable
tiene una referencia a TextView
que a su vez tiene una referencia a la Activity
(el Context
) que a su vez tiene referencias a casi cualquier cosa, dependiendo de su código.
Sin mirar más de su código, supongo que está en el camino correcto al establecer null
en las devoluciones de llamadas de los objetos almacenados cuando se destruye una Activity
.