NullPointerException que no apunta a ninguna línea en mi código

Estoy trabajando en un juego donde el jugador puede arrastrar y soltar cosas en la pantalla. Tengo un método privado que me permite simular un evento de arrastrar / soltar para cualquiera de los elementos que el jugador puede moverse. Para el arrastrar estoy dejando realmente la visión que tocaron donde está y crear un nuevo ImageView con y fijar el drawable al drawingCache de la opinión tocada, después mover este ImageView nuevamente creado alrededor de la pantalla que sigue su dedo. Cuando myLayout.remove(movingImg); tu dedo (suelta la vista) estoy llamando a myLayout.remove(movingImg); Para sacarlo de la pantalla. Estoy teniendo un problema donde si comienzo un acontecimiento de la fricción simulado y después recojo manualmente uno de los otros artículos que estoy consiguiendo un puntero nulo en la llamada de myLayout.remove (), aquí es la huella del registro:

 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): java.lang.NullPointerException 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2122) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.View.draw(View.java:9032) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.widget.FrameLayout.draw(FrameLayout.java:419) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1910) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.draw(ViewRoot.java:1608) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.performTraversals(ViewRoot.java:1329) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.handleMessage(ViewRoot.java:1944) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Handler.dispatchMessage(Handler.java:99) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Looper.loop(Looper.java:126) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.app.ActivityThread.main(ActivityThread.java:3997) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invokeNative(Native Method) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invoke(Method.java:491) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at dalvik.system.NativeStart.main(Native Method) 

El rastro no apunta a ningún lugar dentro de mi actividad. La excepción se activa cuando intenta llamar a myLayout.remove () en la vista de arrastre simulada. Rodeé esta línea con un try / catch pero eso no hizo nada. Sé que esta es la línea que me está dando problemas porque si lo comento, entonces no tengo una excepción, pero obviamente, entonces mi vista nunca se quita de la pantalla. Estoy construyendo esta aplicación en un Motorola xoom, no estoy seguro si esto es un problema específico del dispositivo o no sin embargo. ¿Alguien sabe lo que podría estar pasando aquí?

Este es el lugar donde se obtiene el .removeView () desde:

  @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub Log.i(myTag, "Animation End"); try { //myLayout.removeView(simulateMovingImg); //This is the line that is throwing a null pointer simulateMovingImg.setVisibility(View.GONE); //This is how I am currently getting around the issue params = new LayoutParams(oneImg.getWidth(),oneImg.getHeight()); // While its moving it appears larger than normal simulateMovingImg.setLayoutParams(params); // so I set it back to the normal size if(whichTarget == true){ targetImg.setImageDrawable(simulateMovingImg.getDrawable()); //targetImg is one of the 'drop zones' so I set its // drawable to make it seem like the view was 'dropped' into this zone }else{ target1Img.setImageDrawable(simulateMovingImg.getDrawable()); // same with target1Img. } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } iAmDone = true; } }); 

Que está dentro de AnimationListener para la animación de traducción que está moviendo mi ImageView de donde empieza a donde se está "caída"

Android hará una excepción cuando cambie la jerarquía de vista en animationEnd.

Todo lo que tienes que hacer es posponer tu llamada así:

 @Override public void onAnimationEnd(Animation animation) { new Handler().post(new Runnable() { public void run() { myLayout.removeView(simulateMovingImg); } }); } 

Mi conjetura es que es un problema multiproceso. Parece que el bucle de renderizado androide interno está encontrando un puntero nulo debido al hecho de que ha eliminado la imagen de otro hilo. El marco de la interfaz de usuario de Android es un solo subproceso y todas las modificaciones a la interfaz de usuario deben suceder en el subproceso de interfaz de usuario. Si este es el problema que está encontrando entonces sólo puede delegar su llamada a la interfaz de usuario de hilo.

Hay alguna información relacionada aquí: android threading

¿Puede probar esto, para asegurarse de que simulateMovingImg está presente

  if (myLayout.indexOfChild() >= 0) { myLayout.removeView(simulateMovingImg); } 

Encontré este problema después de actualizar el appcompat-v7. La última versión estable de la dependencia antes mencionada es ahora:

  compile 'com.android.support:appcompat-v7:23.2.1' 

Cambié ligeramente una respuesta aceptada (también funciona) para evitar los manejadores.

 @Override public void onAnimationEnd(Animation animation) { imageView.post(new Runnable() { @Override public void run() { layout.removeView(imageView); } }); } 
  • Cómo configurar Tint en NavigationView a algunos iconos
  • Cómo manejar el botón de nuevo de la vista de búsqueda en android
  • Derecho a la izquierda ProgressBar?
  • Cómo obtener NoSuchMethodError con métodos TextView
  • Guardar / restaurar el estado de vistas personalizadas en android
  • Relación de aspecto fija
  • ¿Es posible comprobar si una "TAB" específica en TabWidget está visible en la vista actual o no?
  • Cómo ocultar el teclado de Android en la vista de búsqueda
  • TextView dentro de ViewPager intercepta eventos de toque
  • Cuál es la ventaja de usar el espacio sobre la vista
  • Meta de Viewport para el navegador predeterminado de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.