Cómo salir de error de memoria al iniciar una actividad en la aplicación android?

Estoy trabajando en una aplicación donde una actividad es un código muy complejo con diferentes vistas infladas en un solo diseño como webview (que está utilizando archivos html de sdcard con imágenes), visiones de imágenes, scrolls.At iniciar esta actividad estoy recibiendo estos errores.

E/AndroidRuntime(600): Caused by: java.lang.reflect.InvocationTargetException E/AndroidRuntime(600): at java.lang.reflect.Constructor.constructNative(Native Method) E/AndroidRuntime(600): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) E/AndroidRuntime(600): at android.view.LayoutInflater.createView(LayoutInflater.java:586) E/AndroidRuntime(600): ... 29 more E/AndroidRuntime(600): Caused by: java.lang.OutOfMemoryError E/AndroidRuntime(600): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) E/AndroidRuntime(600): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483) E/AndroidRuntime(600): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) E/AndroidRuntime(600): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) E/AndroidRuntime(600): at android.content.res.Resources.loadDrawable(Resources.java:1935) E/AndroidRuntime(600): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) E/AndroidRuntime(600): at android.view.View.<init>(View.java:2785) E/AndroidRuntime(600): at android.view.View.<init>(View.java:2722) E/AndroidRuntime(600): at android.view.ViewGroup.<init>(ViewGroup.java:379) E/AndroidRuntime(600): at android.widget.RelativeLayout.<init>(RelativeLayout.java:174) E/AndroidRuntime(600): ... 32 more 

Cómo solucionar este problema He intentado este código pero todavía no sé qué hacer?

  @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.rootView)); System.gc(); } 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(); } } 

¿Cuál es la manera posible de resolver este problema? Por favor ayuda

La mejor manera de optimizar el uso de la memoria con mapas de bits en su caso es guardar una lista de sus ImageViews hacer esto antes de terminar la llamada () para cada ImageView:

 ((BitmapDrawable) myImageView.getDrawable()).getBitmap().recycle(); myImageView = null; 

Utilice también el código en el código de onPause , con el diseño principal de su actividad teniendo el id top_layout :

 @Override protected void onPause() { super.onPause(); unbindDrawables(findViewById(R.id.top_layout)); System.gc(); } 

Después de buscar y ver la respuesta anterior he escrito un fragmento simple por sólo modificar el código de Android User.I han utilizado esto que está trabajando con éxito.Este código setCallback el fondo de la vista e incluso reciclar todo el mapa de bits actual utilizado.

  @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.rootView)); System.gc(); } static void unbindDrawables(View view) { try{ System.out.println("UNBINDING"+view); if (view.getBackground() != null) { ((BitmapDrawable)view.getBackground()).getBitmap().recycle(); view.getBackground().setCallback(null); view=null; } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } 

EDITAR:

Una cosa nueva que he descubierto hoy en día con imágenes de menos de 20 kb de tamaño es bueno para la optimización de la memoria y menos u tiene que pasar por el error de memoria.

Obtendrá la excepción OutOfMemoryException si los píxeles de la imagen exceden el límite. (La resolución máxima es 2048 * 2048)

Puede reducir los píxeles de la imagen utilizando Bitmapfactory.Options –

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; Bitmap myBitmap = BitmapFactory.decodeFile(mUri.getPath(),options); Drawable d = new BitmapDrawable(Resources.getSystem(),myBitmap); updateDrawable(d); 

Mientras usa sus imágenes en la actividad, reduzca su resolución.

Nota – inSampleSize = 2 significa que reduce el tamaño en 1/2 y la resolución en 1/4.

Trate de mantener el valor de inSampleSize en el poder de 2 también obtener los mejores resultados.

Espero que funcione para usted. Cualquier consulta, por favor comente.

  • ¿Cómo descubro el uso de memoria de mi aplicación en Android?
  • Obtenga memoria de proceso libre en android
  • Android con poca memoria, por ninguna razón obvia
  • ¿Es esta Runnable a salvo de fugas de memoria?
  • ¿Puede un futuro programado causar una pérdida de memoria?
  • DialogFragment pérdida de memoria
  • Fuga de memoria de WebView en la aplicación de Android
  • ¿Cómo acceder a Classloaders / App Linearalloc classinformation size?
  • Fuga de memoria de Android EditText
  • Android: cómo manejar el almacenamiento de archivos en la memoria baja del dispositivo (memoria interna / externa)
  • Aumento de la memoria de YouWave
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.