Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Unbinding drawables onPause () causando una respuesta de navegación que no responde y saltando este paso causa desbordamiento de memoria

Estoy utilizando una imagen para establecer como fondo para todas mis actividades, pero estaba causando un problema de desbordamiento de memoria y bloqueo de la aplicación. Ahora estoy unbinding mi drawables en la pausa () y en Destroy () en mi actividad y ahora muestra la pantalla en blanco al presionar el botón de la parte posterior. Entonces, ¿cómo puedo evitar esto sin usar memoria extra.

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(); } 

Inicialmente estaba inflando mi diseño usando android: background = "@ drawable /" que siempre causó error de desbordamiento de memoria diciendo que VM no nos permite asignar 10MB (app.) Ahora estoy recibiendo un mapa de bits de que se puede dibujar sin reducción de tamaño y vinculante En runtime.Now dice VM no nos permite asignar 5MB (app.) Sin usar unbindDrawables (..) Obviamente, la calidad de la imagen de fondo que se muestra ha disminuido, pero no soy capaz de entender que si estoy usando un Png archivo de 13KB, ¿cómo JVM requiere 5 o 10MB de espacio para procesar la solicitud?

He cambiado mis declaraciones de la disposición de onCreate () al método de onResume () pero la aplicación otra vez funciona de memoria al presionar botón posterior.

 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(); } } 

  • Android.view.InflateException: Línea # 2 del archivo XML binario: Error al inflar la clase <unknown>
  • Liberar memoria de una actividad particular cuando se destruye
  • ¿Por qué hay cientos de mapas de bits en la memoria para una aplicación básica para Android?
  • Error de Eclipse: MAT
  • Error de Android: java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM
  • Guardar en tarjeta SD como archivo de texto
  • ¿Hay consejos de administración de memoria para cuidar al crear aplicaciones de Android?
  • Bitmap reciclado con largeHeap habilitado
  • 2 Solutions collect form web for “Unbinding drawables onPause () causando una respuesta de navegación que no responde y saltando este paso causa desbordamiento de memoria”

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

    Usted está llamando GC para cada vista secundaria. Trate de llamar sólo una vez cuando todos los unbinds se hacen.

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

    GC es una carga pesada y es inútil llamarla demasiado a menudo. De hecho, si no hay fugas debe ser nesesary 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 en http://developer.android.com/training/displaying-bitmaps/index.html

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.