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?
- SQLite Android asignación de la ventana de cursor de 2048 kb falló
- "Advertencia: no coloque las clases de contexto de Android en campos estáticos; Esto es una fuga de memoria (y también rompe el funcionamiento inmediato) "
- FragmentStatePagerAdapter OutOfMemoryError
- Uso de la memoria de aplicaciones Android de Xamarin
- Tamaño del mapa de bits devuelto por la cámara a través de la intención?
@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
- ¿Cómo puedo crear Libgdx.so desde el origen para Android con el rastreo gdb habilitado?
- ¿Cómo utilizar Valgrind con la aplicación android en Eclipse en Ubuntu para encontrar fugas de memoria de código nativo android en tiempo de ejecución?
- Android java.lang.OutOfMemoryError?
- Decodificación de mapas de bits en Android con el tamaño correcto
- Android: ¿Dónde está la herramienta Monitor de memoria?
- Android - Cómo obtener el uso de memoria de mi dispositivo Android
- Enum de tamaño de byte en Java
- Android: pérdida de memoria debido a AsyncTask
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.