2012-10-11 31 views
11

Recibí algunos mensajes de error de mi aplicación con un simple clic de botón. Después del clic, debe comenzar una animación, pero el botón se vuelve más grande. Funciona perfectamente en la mayoría de los dispositivos, pero en algunos (creo que principalmente 4.X y superior) se bloquea.NullPointerException con Hardwareacceleration activado?

Mensaje de excepción (Seguimiento de la pila):

java.lang.NullPointerException 
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118) 
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:400) 
at android.view.View.draw(View.java:10999) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3186) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.View.draw(View.java:11017) 
at android.view.View.getDisplayList(View.java:10444) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2896) 
at android.view.View.getDisplayList(View.java:10407) 
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:883) 
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2089) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1781) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:156) 
at android.app.ActivityThread.main(ActivityThread.java:4977) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 

Gracias de antemano!

Respuesta

2

He estado buscando la respuesta a esto durante los últimos días. Está documentado en ICS, pero lo he notado en uno de mis teléfonos de prueba, un Samsung Galaxy S3 con 4.1.2. La mayoría de la gente sugiere apagar la aceleración de hardware; No quería hacer eso porque la aceleración de hardware hace que mis animaciones sean tan sedosas. Entonces, lo que encontré fue que, si anulo draw(), intento capturar la excepción del puntero nulo, las funciones aceleradas por hardware funcionan (la mayoría del tiempo) y lo suficiente como para que nunca note que no están funcionando o lanzando la excepción.

@Override 
public void draw(Canvas canvas) { 
    try{ 
     super.draw(canvas); 
    }catch(java.lang.NullPointerException e){ 
     //you can log if you want to you can leave your friends behind 
     //Log.e("mytag","MyCustomView::draw():"+e); 
    } 
} 
+1

Dale la espalda a la brevedad. El método 'draw' no ejecuta ningún código de aplicación, por lo que si la lógica de su aplicación arroja cualquier excepción de puntero nulo, se encontrarán en cualquier otro lugar (por ejemplo, en el evento, etc.), pero ciertamente no al dibujar. Hay poco que su aplicación hace cuando ocurre un redibujado. Supongo que este método es seguro para su aplicación. Pero si es seguro para el dispositivo, no lo sé. – Subhas

0

He visto este mismo error y es extraño, pero solo ocurre en un escenario muy específico.

Lo describiré aquí en caso de que ayude a alguien.

Aparece cuando ejecuto una animación de escala que va al 0% en una vista (básicamente se reduce al centro de la pantalla) en un dispositivo ICS con la aceleración HW activada.

  • En ICS, aceleración de HW desactivada, no se bloquea.
  • En ICS, la aceleración HW en, otros tipos de animación (crecer, traducir) no se bloquea.
  • En Jelly Bean (4.1, 4.3) (cualquier combinación de otros factores) no se cuelga.

Creo que desactivaré la aceleración de HW solo para esa vista y sigo adelante, por lo que el resto de mi aplicación funcionará sin problemas.

Espero que esto ayude.

Cuestiones relacionadas