Подтвердить что ты не робот

Сбой 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-коде?

4b9b3361

Ответ 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 вызывает это исключение. Однако, если вы внимательно изучите это, проблема с оборудованием может стать проблемой. Так что ручка (поймать) вопрос.