2012-09-12 7 views
6

Estoy utilizando una imagen para establecer como fondo todas mis actividades pero estaba causando un problema de desbordamiento de memoria y bloqueo la aplicación. Ahora estoy desvinculando mis drawable en pause() y en Destroy() en mi actividad y ahora muestra una pantalla en blanco al presionar el botón Atrás. Entonces, ¿cómo puedo evitar esto sin usar memoria extra?Desenlazar objetos imprimibles onPause() que causan una navegación posterior que no responde y omitir este paso provocar un desbordamiento de memoria

protected void onPause(){ 
    super.onPause(); 
    unbindDrawables(findViewById(R.id.login_root)); 
} 

protected void onDestroy() { 
     unbindDrawables(findViewById(R.id.login_root)); 
     super.onDestroy(); 
     } 

private void unbindDrawables(View view) { 
    System.gc(); 
    Runtime.getRuntime().gc(); 
    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(); 
    } 

principio yo estaba inflando mi diseño utilizando Android: Fondo = "@ estirable /", que siempre se produce error de desbordamiento de memoria VM diciendo que no nos deja asignamos 10MB Ahora me estoy haciendo un mapa de bits a partir de (aprox.) ese drawable sin reducir y vincularlo en tiempo de ejecución. Ahora dice que VM no nos permitirá asignar 5MB (app) sin usar unbindDrawables (..) Obviamente, la calidad de la imagen de fondo que se muestra ha disminuido pero no puedo para entender que si estoy usando un archivo png de 13KB, ¿cómo JVM requiere 5 o 10MB de espacio para procesar la solicitud?

He cambiado mis declaraciones de diseño de método onCreate() a onResume() pero la aplicación se queda sin memoria al presionar el botón Atrás.

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    protected void onResume(){ 
     setContentView(R.layout.home); 
     Bitmap bmp; 
     ImageView background = (ImageView)findViewById(R.id.iv_home_background); 
     InputStream is = getResources().openRawResource(R.drawable.background); 
     bmp = BitmapFactory.decodeStream(is); 
     background.setImageBitmap(bmp); 

     super.onResume(); 
    } 

protected void onPause(){ 
     super.onPause(); 
     unbindDrawables(findViewById(R.id.home_root)); 
    } 


private void unbindDrawables(View view) { 
     System.gc(); 
     Runtime.getRuntime().gc(); 
     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(); 
     } 
    } 
+0

Recuerda que si se llama onDestroy(), también se llama a onPause(). –

+0

desvincular solo en 'onPause()' como dijo @JohnSatriano. Pero aún así, muéstrenos su función onResume –

+0

No anulé mi función Reanudar. No tengo ni idea de qué hacer allí. – Atinder

Respuesta

1

He encontrado un problema para este problema. Ahora estoy escalando mis bitmaps en tiempo de ejecución a un tamaño muy pequeño y luego almacenándolos en almacenamiento interno. El programa llama a los mapas de bits escalados del almacenamiento en tiempo de ejecución y, si no está presente allí, lo llama desde una carpeta dibujable, lo escala, lo escribe en el almacenamiento y luego lo vincula a la vista. De esta manera no hay necesidad de llamar al método unbindDrawables en ningún momento y la aplicación sigue siendo receptiva en todo momento. Mi única preocupación ahora es la calidad de los mapas de bits, creo que necesito jugar con el tamaño de escala para encontrar el menor tamaño posible con la máxima calidad.

0

Está llamando a GC para cada subvista. Intenta llamarlo solo una vez cuando finalicen todas las desvinculaciones.

unbindDrawables(findViewById(R.id.login_root)); 
System.gc(); 

GC es una carga pesada y es inútil llamarla con demasiada frecuencia. de hecho, si no hay fugas, debe ser nesesario en absoluto.

También tenga en cuenta que los tamaños de archivo png no tienen nada que ver con un mapa de bits en la memoria. Aquí hay más información sobre eso http://developer.android.com/training/displaying-bitmaps/index.html

Cuestiones relacionadas