Llamar ViewGroup # addView y ViewGroup # removeView causa NullPointerException

Dentro de un método, llamo addView y removeView como sigue:

 public class EnclosingClass extends FrameLayout { ... void fooMethod() { ... viewGroup1.addView(this); viewGroup2.removeView(this); ... } ... } 

Esto funciona bien en el modo de retrato (que se llama muchas veces sin ningún problema), pero tan pronto como cambiar la orientación de la pantalla a paisaje, obtengo una NullPointerException : (FYI, fooMethod se llama de surfaceChanged durante el cambio de orientación) :

  18376 AndroidRuntime E FATAL EXCEPTION: main 18376 AndroidRuntime E Process: com.google.android.apps.chrome, PID: 18376 18376 AndroidRuntime E java.lang.NullPointerException 18376 AndroidRuntime E at android.widget.FrameLayout.layoutChildren(FrameLayout.java:405) 18376 AndroidRuntime E at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 18376 AndroidRuntime E at android.view.View.layout(View.java:14817) 18376 AndroidRuntime E at android.view.ViewGroup.layout(ViewGroup.java:4631) 18376 AndroidRuntime E at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 18376 AndroidRuntime E at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 18376 AndroidRuntime E at android.view.View.layout(View.java:14817) 18376 AndroidRuntime E at android.view.ViewGroup.layout(ViewGroup.java:4631) 18376 AndroidRuntime E at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 18376 AndroidRuntime E at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 18376 AndroidRuntime E at android.view.View.layout(View.java:14817) 18376 AndroidRuntime E at android.view.ViewGroup.layout(ViewGroup.java:4631) 18376 AndroidRuntime E at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987) 18376 AndroidRuntime E at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744) 18376 AndroidRuntime E at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 18376 AndroidRuntime E at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670) 18376 AndroidRuntime E at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 18376 AndroidRuntime E at android.view.Choreographer.doCallbacks(Choreographer.java:574) 18376 AndroidRuntime E at android.view.Choreographer.doFrame(Choreographer.java:544) 18376 AndroidRuntime E at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 18376 AndroidRuntime E at android.os.Handler.handleCallback(Handler.java:733) 18376 AndroidRuntime E at android.os.Handler.dispatchMessage(Handler.java:95) 18376 AndroidRuntime E at android.os.Looper.loop(Looper.java:136) 18376 AndroidRuntime E at android.app.ActivityThread.main(ActivityThread.java:5017) 18376 AndroidRuntime E at java.lang.reflect.Method.invokeNative(Native Method) 18376 AndroidRuntime E at java.lang.reflect.Method.invoke(Method.java:515) 18376 AndroidRuntime E at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 18376 AndroidRuntime E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 18376 AndroidRuntime E at dalvik.system.NativeStart.main(Native Method) 

Para solucionar este problema, pongo addView y removeView dentro de un Runnable como sigue:

 void fooMethod() { ... new Handler().post(new Runnable() { @Override public void run() { viewGroup1.addView(EnclosingClass.this); viewGroup2.removeView(EnclosingClass.this); }); ... } 

Esto soluciona el problema, y ​​todo parece estar funcionando bien, pero no entiendo por qué. ¿Cómo puede ayudar el problema a poner los métodos dentro de la cola de mensajes? Además, ¿por qué no veo ninguna referencia a mi código en el seguimiento de la pila? Encontré el problema comentando el código gradualmente.

One Solution collect form web for “Llamar ViewGroup # addView y ViewGroup # removeView causa NullPointerException”

 public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); }`enter code here` } 

ya que utiliza runOnUiThread en realmente UIThread, por lo que el código se ejecuta en otra rama: action.run () que es una operación en serie. Si otro api todavía se ejecuta en UI Thread con mChildCount local, encontrará el puntero NULL, (UI Thread no es seguro )

  • ClassCastException LinearLayout LayoutParams
  • Agregar vistas de los niños a un FrameLayout por programación, a continuación, cambiar sus posiciones
  • Android cámara de pantalla completa - manteniendo la cámara seleccionada ratio
  • Android: Establecer márgenes en un FrameLayout mediante programación, no funciona
  • Escala la imagen de fondo para ajustar el contenido del diseño
  • Layout_marginLeft funciona correctamente en Android API <11 cuando View in FrameLayout
  • Handle Fragment duplication on Screen Rotate (con código de ejemplo)
  • Dos diseños de marco en el ejemplo de FragmentTabs de Android Support4Demos
  • Tratando de agregar un fragmento a mi contenedor de fragmentos FrameLayout
  • Android: Reutilización de vistas incrustadas en gridview
  • Android - La altura de la estructura del marco no coincide con el diseño del coordinador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.