Сбой Android ViewGroup: попытка чтения из поля 'int android.view.View.mViewFlags' по ссылке на нулевой объект
Мы обнаружили несколько случаев для такого рода сбоев, о которых сообщалось в ходе мониторинга бэкэнд-журнала. Похоже, что аварии не связаны с отказом UX. И из отчетов нет никаких признаков того, как участвуют наши собственные классы (никаких признаков каких-либо имен наших классов). Вот пример типичных сбоев:
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)
Кто-нибудь знает, есть ли связанная ошибка, зарегистрированная в Android-коде?
Ответы
Ответ 1
Возможное решение
У меня была такая же проблема. Я устанавливаю animation
, а в onAnimationEnd
я удаляю объект, который был анимирован, когда возникают проблемы. То, что я сделал, - это настроить асинхронный Runnable
, чтобы подождать 100 миллисекунд после остановки анимации перед удалением анимированного объекта:
ранее анимированный объект 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);
}
Приветствие
Ответ 2
У меня была такая же проблема. Я решил с Handler.
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// remove fragment from here
}
});
Ответ 3
Проблема заключается в ViewGroup
dispatchDraw()
. Этот метод пытается нарисовать все ViewGroup
. Когда дочерний элемент имеет значение null
, вы получаете исключение, которое, скорее всего, происходит из этой строки: if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
(обратите внимание на mViewFlags
).
Таким образом, проблема в том, что одно из ваших представлений где-то неправильно инициализировано. Я боюсь, что лучшее, что я могу сделать.
Ответ 4
Мы тоже начали получать эту ошибку. Он был отслежен до фрагментации анимации, являющейся проблемой. Более конкретно использование пользовательских анимаций с replace()
в транзакции фрагмента, когда приложение построено против Local Maven repository for Support Libraries
rev > 26.
Возможное решение
Снизьте Local Maven repository for Support Libraries
до оборота 26. См. здесь
Ответ 5
Возможная причина:
У меня была такая же проблема. Оказалось, что это начало происходить, когда я добавил код для изменения дерева представлений в вызове onDraw(). Чтобы быть конкретным, я удалил представление с дочерними элементами в моем производном onDraw(), когда были выполнены определенные условия. Теперь я считаю, что это плохо, потому что платформа пытается нарисовать виды, которые я теперь удалил из дерева представлений. Я решил проблему, отправив удаление с помощью Runnable после завершения вызова onDraw().
Ответ 6
Переопределите метод dispatchDraw и поместите в него блок try/catch, например:
public void dispatchDraw(Canvas c)
{
try
{
super.dispatchDraw(c);
return;
}
catch(Exception exception)
{
return;
}
}
Ответ 7
Несмотря на то, что исключение является распространенным, вызывающий источник необычен и возникает, когда у вас так много динамических представлений. Вы можете проверить, подключив недорогие мобильные телефоны с открытым Instagram. Иногда прокрутка на странице Instagram вызывает это исключение. Однако, если вы внимательно изучите это, проблема с оборудованием может стать проблемой. Так что ручка (поймать) вопрос.