studio puedo problemas porque instalar error descargar corregir con comunes android bitmap

puedo - ¿Error de Android al intentar utilizar un mapa de bits reciclado?



problemas comunes en android studio (2)

No necesitas llamar al método de reciclaje aquí. El botón Actualizar solo debe borrar la matriz, el recolector de basura liberará la memoria más tarde. Si obtiene OutOfMemory, significa que algunos otros objetos aún hacen referencia a sus imágenes antiguas y el recolector de basura no puede eliminarlas.

Puedo suponer que algunos ImageViews muestran sus mapas de bits y mantienen referencias a esos mapas de bits. No puede eliminar los mapas de bits antiguos mientras aún se muestran. Así que una posible solución es borrar ImageVIews también. Después de eso, puede borrar la matriz y rellenarla con nuevas imágenes.

Reciclar libera la memoria, pero algunos ImageView siguen mostrando el mapa de bits y no puede hacer eso después del reciclaje, por eso obtiene "Intentando utilizar un mapa de bits reciclado".

Estas son solo suposiciones porque no puedo ver su código completo.

Estoy teniendo problemas con los mapas de bits en una aplicación de Android en la que estoy trabajando. Lo que se supone que sucede es que la aplicación descarga imágenes de un sitio web, las guarda en el dispositivo, las carga en la memoria como mapas de bits en una lista de elementos y las muestra al usuario. Todo esto funciona bien cuando la aplicación se inicia por primera vez. Sin embargo, he agregado una opción de actualización para el usuario donde se eliminan las imágenes, y el proceso descrito anteriormente comienza de nuevo.

Mi problema: al usar la opción de actualización, las imágenes antiguas aún estaban en la memoria y rápidamente obtendría OutOfMemoryErrors. Por lo tanto, si las imágenes se están actualizando, lo hice correr a través del arraylist y reciclar las imágenes antiguas. Sin embargo, cuando la aplicación va a cargar las nuevas imágenes en el arraylist, se bloquea con el error "Intentando utilizar un mapa de bits reciclado".

Por lo que yo entiendo, reciclar un mapa de bits destruye el mapa de bits y libera su memoria para otros objetos. Si quiero volver a utilizar el mapa de bits, debe reinicializarse. Creo que estoy haciendo esto cuando los nuevos archivos se cargan en el arraylist, pero algo sigue mal. Cualquier ayuda es muy apreciada ya que es muy frustrante. El código de problema está abajo. ¡Gracias!

public void fillUI(final int refresh) { // Recycle the images to avoid memory leaks if(refresh==1) { for(int x=0; x<images.size(); x++) images.get(x).recycle(); images.clear(); selImage=-1; // Reset the selected image variable } final ProgressDialog progressDialog = ProgressDialog.show(this, null, this.getString(R.string.loadingImages)); // Create the array with the image bitmaps in it new Thread(new Runnable() { public void run() { Looper.prepare(); File[] fileList = new File("/data/data/[package name]/files/").listFiles(); if(fileList!=null) { for(int x=0; x<fileList.length; x++) { try { images.add(BitmapFactory.decodeFile("/data/data/[package name]/files/" + fileList[x].getName())); } catch (OutOfMemoryError ome) { Log.i(LOG_FILE, "out of memory again :("); } } Collections.reverse(images); } fillUiHandler.sendEmptyMessage(0); } }).start(); fillUiHandler = new Handler() { public void handleMessage(Message msg) { progressDialog.dismiss(); } };

}


Si la memoria es muy grande, es mejor que recicle el mapa de bits. GC no puede ser controlado.