web-dev-qa-db-ja.com

Android ViewGroup crash:nullオブジェクト参照でフィールド '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コードに対して記録された関連バグがあるかどうかは誰でも知っていますか?

59
M2014

可能な解決策

これと同じ問題がありました。 animationをセットアップし、onAnimationEndで、問題が始まったアニメーション化されたオブジェクトを削除していました。私がやったのは、asynchronousRunnableを設定して、アニメーションが停止した後、アニメーションオブジェクトを削除する前に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);
}

Cheers

25
Jacksonkr

私は同じ問題に直面していました。ハンドラーで解決しました。

new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                   // remove fragment from here
                }
            });
11

問題はViewGroupdispatchDraw()メソッドにあります。このメソッドは、ViewGroupのすべての子を描画しようとします。子がnullの場合、例外が発生します。これは、 この行if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {mViewFlagsに注意してください)から発生する可能性が高いです。

したがって、問題は、ビューの1つがどこかで適切に初期化されていないことです。それが私ができる最善のことだと思います。

9
kevinpelgrims

このエラーも予想外に発生し始めました。問題となっているアニメーションの断片化まで追跡されました。より具体的には、アプリケーションがLocal Maven repository for Support Libraries rev> 26に対して構築されている場合、フラグメントトランザクションでreplace()を使用してカスタムアニメーションを使用します。

可能な解決策

Local Maven repository for Support Librariesをrev 26にダウングレードします。 here を参照してください

4
veritas1

考えられる原因:私はまったく同じ問題を抱えていました。 onDraw()呼び出し内でビューツリーを変更するコードを追加したときに発生し始めたことが判明しました。具体的には、特定の条件が満たされたときに、派生したonDraw()の子を持つビューを削除しました。これは、プラットフォームがビューツリーから削除したビューを描画しようとしているためと思われます。 onDraw()の呼び出しが終了した後にRunnableを使用して削除を送信することで問題を解決しました。

2
Teemu Lätti

例外は一般的ですが、原因となるソースは一般的ではなく、非常に多くの動的ビューがある場合に発生しますです。 Instagramページをスクロールすると、この例外が発生する場合があります。ただし、それを詳しく見ると、ハードウェアの問題が問題になる可能性があります。したがって、問題を処理するだけです(catch)。

0
Pradeep

DispatchDrawメソッドをオーバーライドし、次のようにtry/catchブロックを追加します。

public void dispatchDraw(Canvas c)
    {
        try
        {
            super.dispatchDraw(c);
            return;

        }
        catch(Exception exception)
        {
            return;
        }
    }
0