PDA

Ver la Versión Completa : [ CONSULTA ] Necesito ayuda con un error..


Guixe94
08/06/14, 16:29:01
Hola,

hace unos dias subí mi aplicación al play store, pero he podido comprobar (y algunos usuarios también por que han mandado informe de error) que si abres la app rapido y vas navegando por las actividades rápido (entras a una le das atras entras a otra le das atras, etc) al final la app peta.. tampoco es que haga falta hacerlo muy rápido.. osea que no es en dos segundos.. pero acaba petando, luego la vuelves a abrir y va bien y eso pero nose quiero haber si alguien puede ayudarme.

El error es este: java.lang.OutOfMemoryError cuando lo pruebo en el emulador también me sale eso en el log aunque no llega a cerrarse ni nada por que no puedo hacer la prueba (ya que el emulador me va muy lento.. tengo AMD).

Yo he probado la app en: galaxy NOTE 3, htc one y xperia arc s y los tres pasa lo mismo.. los reportes de errores son de un Note 2 y un SGs3 osea que mas o menos todos son moviles potentes.. por eso me extraña el mensaje..

He de decir que en mi app todo son activities no tengo ningún fragment por lo que tengo unas 150 actividades con sus respectivas clases (.java). No se si puede ser por eso o no..

Esto es todo lo que me dice la consola de desarrolladores:

java.lang.OutOfMemoryError
en android.graphics.BitmapFactory.nativeDecodeAsset

Seguimiento:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.barwill94.wikicraft/com.barwill94.wikicraft.MainActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2282)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2340)
at android.app.ActivityThread.access$800(ActivityThre ad.java:157)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.jav a:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInfla ter.java:626)
at com.android.internal.policy.impl.PhoneLayoutInflat er.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInf later.java:675)
at android.view.LayoutInflater.createViewFromTag(Layo utInflater.java:700)
at android.view.LayoutInflater.inflate(LayoutInflater .java:470)
at android.view.LayoutInflater.inflate(LayoutInflater .java:398)
at android.view.LayoutInflater.inflate(LayoutInflater .java:354)
at com.android.internal.policy.impl.PhoneWindow.setCo ntentView(PhoneWindow.java:340)
at android.app.Activity.setContentView(Activity.java: 1973)
at android.support.v7.app.ActionBarActivity.superSetC ontentView(ActionBarActivity.java:216)
at android.support.v7.app.ActionBarActivityDelegateIC S.setContentView(ActionBarActivityDelegateICS.java :110)
at android.support.v7.app.ActionBarActivity.setConten tView(ActionBarActivity.java:76)
at com.barwill94.wikicraft.MainActivity.onCreate(Main Activity.java:19)
at android.app.Activity.performCreate(Activity.java:5 389)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2246)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Nati ve Method)
at java.lang.reflect.Constructor.newInstance(Construc tor.java:423)
at android.view.LayoutInflater.createView(LayoutInfla ter.java:600)
... 26 more
Caused by: java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(N ative Method)
at android.graphics.BitmapFactory.decodeStream(Bitmap Factory.java:677)
at android.graphics.BitmapFactory.decodeResourceStrea m(BitmapFactory.java:507)
at android.graphics.drawable.Drawable.createFromResou rceStream(Drawable.java:872)
at android.content.res.Resources.loadDrawable(Resourc es.java:3022)
at android.content.res.TypedArray.getDrawable(TypedAr ray.java:602)
at android.view.View.<init>(View.java:3690)
at android.view.View.<init>(View.java:3620)
at android.view.ViewGroup.<init>(ViewGroup.java:474)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:236)
... 29 more


Último informe
Hoy, 14:47
Informes de esta semana
1
Informes totales
1
Versión de la aplicación

1.3
1
Versión de Android

Android 4.4
1
Dispositivo

Galaxy Note3 (hlte)



Pues eso, a ver si alguien consigue echarme una mano.. por que de momento no he recibido quejas pero la verdad es que es algo molesto..

Por si queréis descargar la app y probar para que veáis si os pasa os dejo el link, ir navegando por las secciones de manera fluidita y os acabara pasando.

GRACIAS!

kriogeN
08/06/14, 16:40:40
Tu problema está en un problema que viene arrastrando Android desde sus orígenes, y es el pésimo control de memoria que tiene con los Bitmap.

Al final todo se resume en lo siguiente:

1) Usar imágenes lo más pequeñas posibles, es decir, si cargas una imagen de la galería que tiene 18 MP en el móvil nunca se va a mejor mejor de 1080x1080 (y eso en los de última generación), así que cuando la vayas a cargar redúcela hasta ese tamaño como máximo.

2) Si puedes precargar las imágenes, hazlo, es decir, si vas a usar la misma imagen 5 veces en la misma Activity no la cargues 5 veces, cárgala la primera vez en el onCreate y luego reutilízala.

3) Si tienes referencia constante a la imagen, descárgala cuando termines con ella (por ejemplo en el onDestroy), si no la tienes, usa SoftReference (por ejemplo cuando metes imágenes en un ListView). No abuses del SoftReference para cosas estáticas que puedes descargar a mano porque es muy probable que el sistema no pierda la referencia y no la descargue por ti.

Y por último, casos especiales en que la imagen se genere por interacción del usuario. Por ejemplo si haces una foto con la cámara y luego la conviertes en Bitmap, mételo entre un try-catch (OutOfMemoryError), informa al usuario de que ha habido un problema, y ejecuta un System.gc() para solicitar al recolector que pase y así tener más opciones de que la siguiente vez funcione correctamente.

Guixe94
10/06/14, 11:32:52
Tu problema está en un problema que viene arrastrando Android desde sus orígenes, y es el pésimo control de memoria que tiene con los Bitmap.

Al final todo se resume en lo siguiente:

1) Usar imágenes lo más pequeñas posibles, es decir, si cargas una imagen de la galería que tiene 18 MP en el móvil nunca se va a mejor mejor de 1080x1080 (y eso en los de última generación), así que cuando la vayas a cargar redúcela hasta ese tamaño como máximo.

2) Si puedes precargar las imágenes, hazlo, es decir, si vas a usar la misma imagen 5 veces en la misma Activity no la cargues 5 veces, cárgala la primera vez en el onCreate y luego reutilízala.

3) Si tienes referencia constante a la imagen, descárgala cuando termines con ella (por ejemplo en el onDestroy), si no la tienes, usa SoftReference (por ejemplo cuando metes imágenes en un ListView). No abuses del SoftReference para cosas estáticas que puedes descargar a mano porque es muy probable que el sistema no pierda la referencia y no la descargue por ti.

Y por último, casos especiales en que la imagen se genere por interacción del usuario. Por ejemplo si haces una foto con la cámara y luego la conviertes en Bitmap, mételo entre un try-catch (OutOfMemoryError), informa al usuario de que ha habido un problema, y ejecuta un System.gc() para solicitar al recolector que pase y así tener más opciones de que la siguiente vez funcione correctamente.

La imagen mas grande que tengo pesa unos 200kb todas las edito con photoshop y hago que me ocupen unos 70-100kb no repito imagenes en ninguna actividad.. no se es algo muy molesto la verdad.. y no se que hacer..

kriogeN
10/06/14, 12:30:08
200 kb en JPEG son aproximadamente 20 MB en RAW, que es como trata Android a las imágenes, y una aplicación como máximo puede tener 30 MB simultáneos de VM, así que echa cuentas.