java - viewgroups - vistas y layouts en android
Bloqueo de Android ViewGroup: intento de leer desde el campo ''int android.view.View.mViewFlags'' en una referencia de objeto nulo (7)
Hemos encontrado varios casos para este tipo de fallas informadas por el monitoreo del registro de fondo. Parece que los bloqueos no están vinculados a una falla particular de UX. Y de los informes, no hay signos de cómo están involucradas nuestras propias clases (no hay signos de ninguno de los nombres de nuestras clases). Aquí hay un ejemplo de accidentes típicos:
java.lang.NullPointerException: Attempt to read from field ''int android.view.View.mViewFlags'' on a null object reference
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3357)
at android.view.View.updateDisplayListIfDirty(View.java:14288)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)
at android.view.View.updateDisplayListIfDirty(View.java:14253)
at android.view.View.getDisplayList(View.java:14315)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2561)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2377)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2007)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1086)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6453)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:846)
at android.view.Choreographer.doCallbacks(Choreographer.java:647)
at android.view.Choreographer.doFrame(Choreographer.java:601)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:829)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:927)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:713)
¿Alguien sabe si hay un error relacionado registrado contra el código de Android?
Solución posible
Tuve el mismo problema.
Configuré una
animation
y en
onAnimationEnd
estaba eliminando el objeto que había sido animado, que es cuando comenzaron los problemas.
Lo que hice fue configurar un
Runnable
asíncrono
para esperar 100 milisegundos después de que la animación se detuviera antes de eliminar el objeto animado:
el objeto previamente animado es
this._loader
private void removeLoader() {
final ContentContainer self = this; // "CustomContainer" needs to match the type of `this`
Handler h = new Handler();
h.postAtTime(new Runnable() {
@Override
public void run() {
MainActivity.instance.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if(self._loader == null) {
// there is no loader. quit now while you still have the chance!!
return;
}
while(self._loader.getParent() != null) {
removeView(self._loader);
}
} catch(Exception e) {
Crashlytics.logException(e);
e.printStackTrace();
}
self._loader = null;
}
});
}
}, 100);
}
Aclamaciones
Anule el método dispatchDraw y coloque un bloque try / catch, como este:
public void dispatchDraw(Canvas c)
{
try
{
super.dispatchDraw(c);
return;
}
catch(Exception exception)
{
return;
}
}
Aunque la excepción es común, la fuente causante es poco común y ocurre cuando tiene tantas vistas dinámicas . A veces, desplazarse en la página de Instagram causa esta excepción. Sin embargo, si profundiza en eso, el problema del hardware puede llegar a ser un problema . Así que solo maneja ( atrapa ) el problema.
Comenzamos a recibir este error inesperadamente también.
Fue rastreado hasta fragmentos de animaciones siendo el problema.
Más específicamente, utilizando animaciones personalizadas con
replace()
en una transacción fragmentada cuando la aplicación se compila contra el
Local Maven repository for Support Libraries
rev> 26
Solución posible
Rebajar el
Local Maven repository for Support Libraries
hasta la versión 26. Ver
here
El problema está en el
ViewGroup
dispatchDraw()
ViewGroup
.
Este método intenta dibujar todos los elementos
ViewGroup
de
ViewGroup
.
Cuando un niño es
null
, obtiene una excepción, que probablemente proviene de
esta línea
:
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
(observe los
mViewFlags
).
Entonces, el problema es que una de sus vistas, en algún lugar, no se inicializa correctamente. Me temo que es lo mejor que puedo hacer.
Estaba enfrentando el mismo problema. Resolví con Handler.
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// remove fragment from here
}
});
Causa posible: estaba teniendo exactamente el mismo problema. Resultó que comenzó a suceder cuando agregué código para modificar el árbol de vista dentro de la llamada onDraw (). Para ser específicos, eliminé una vista con niños en mi onDraw () derivado cuando se cumplieron ciertas condiciones. Ahora creo que esto es algo malo, probablemente porque la plataforma está intentando dibujar vistas que ahora he eliminado del árbol de vistas. Resolví el problema publicando la eliminación con Runnable para que ocurriera después de que la llamada a onDraw () haya finalizado.