Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewDataBinding导致在activity.finish()之后恢复应用程序时崩溃,在视图附件期间访问mRebindRunnable时NPE_Android_Android Fragments_Nullpointerexception_Android Viewbinding - Fatal编程技术网

Android ViewDataBinding导致在activity.finish()之后恢复应用程序时崩溃,在视图附件期间访问mRebindRunnable时NPE

Android ViewDataBinding导致在activity.finish()之后恢复应用程序时崩溃,在视图附件期间访问mRebindRunnable时NPE,android,android-fragments,nullpointerexception,android-viewbinding,Android,Android Fragments,Nullpointerexception,Android Viewbinding,成功启动活动后,崩溃表面,膨胀了带有数据绑定的片段。在根级别按下后退按钮后,应用程序(正确地)将执行一个活动.finish(),但将应用程序实例保留在后台。 重新启动时,应用程序会在视图创建后的某个时间点崩溃(至少基于调试) 坠机事件: 2020-08-26 20:00:50.626 9706-9706/com.org.app.dev E/AndroidRuntime: FATAL EXCEPTION: main Process: com.org.app.dev, PID: 9706

成功启动活动后,崩溃表面,膨胀了带有数据绑定的片段。在根级别按下后退按钮后,应用程序(正确地)将执行一个
活动.finish()
,但将应用程序实例保留在后台。 重新启动时,应用程序会在视图创建后的某个时间点崩溃(至少基于调试)

坠机事件:

2020-08-26 20:00:50.626 9706-9706/com.org.app.dev E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.org.app.dev, PID: 9706
    java.lang.NullPointerException: Attempt to read from field 'java.lang.Runnable androidx.databinding.ViewDataBinding.mRebindRunnable' on a null object reference
        at androidx.databinding.ViewDataBinding.access$100(ViewDataBinding.java:65)
        at androidx.databinding.ViewDataBinding$6.onViewAttachedToWindow(ViewDataBinding.java:165)
        at android.view.View.dispatchAttachedToWindow(View.java:19564)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2028)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7598)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
        at android.view.Choreographer.doCallbacks(Choreographer.java:790)
        at android.view.Choreographer.doFrame(Choreographer.java:725)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
深入源代码调试,我能收集到的最好的信息是ViewDataBinding看到以前绑定的视图已重新连接,并尝试与现有资源重新绑定。但是,它显然丢失了对静态runnable的引用。ViewDataBinding中的相关源代码:

    private static final OnAttachStateChangeListener ROOT_REATTACHED_LISTENER;

    static {
        if (VERSION.SDK_INT < VERSION_CODES.KITKAT) {
            ROOT_REATTACHED_LISTENER = null;
        } else {
            ROOT_REATTACHED_LISTENER = new OnAttachStateChangeListener() {
                @TargetApi(VERSION_CODES.KITKAT)
                @Override
                public void onViewAttachedToWindow(View v) {
                    // execute the pending bindings.
                    final ViewDataBinding binding = getBinding(v);
                    binding.mRebindRunnable.run();
                    v.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                }
            };
        }
    }
片段(Kotlin)-

更新


有趣的是,当我尝试将相同的片段(新实例化的)膨胀到不同的(非启动)活动中时,我看到了这一点。在调试这种情况下,除了在膨胀并返回绑定的根视图(而不是null)后遇到崩溃之外,我找不到任何问题。我尝试了布局的created静态方法和DataBindingUtil。两者都经历了相同的碰撞。

尤里卡

不仅
不能用于
布局(此处有详细说明:)

但是

在根目录下有
布局中,绑定也不起作用。下面是它的样子:

<layout>
...

    <include layout="id/sub_layout"
        bind:viewModel="@{viewModel} />
...
</layout>

...

尤里卡

不仅
不能用于
布局(此处有详细说明:)

但是

在根目录下有
布局中,绑定也不起作用。下面是它的样子:

<layout>
...

    <include layout="id/sub_layout"
        bind:viewModel="@{viewModel} />
...
</layout>

...

您需要包含您的代码。感谢@GavinWright查看。我已尝试添加相关的代码位。(活动在java中,片段在Kotlin中)。如前所述,我尝试过改变视图的绑定方式(片段代码),但没有看到任何区别。我还想到了一个片段或活动的实例,它在活动销毁过程中并没有被收集到垃圾。我尝试使用内存分析工具,但不确定要查找什么。好奇是否有人成功识别了活动/片段泄漏,以及这在内存分析工具上是如何显示的。您需要包括您的代码。感谢@GavinWright的关注。我已尝试添加相关的代码位。(活动在java中,片段在Kotlin中)。如前所述,我尝试过改变视图的绑定方式(片段代码),但没有看到任何区别。我还想到了一个片段或活动的实例,它在活动销毁过程中并没有被收集到垃圾。我尝试使用内存分析工具,但不确定要查找什么。好奇是否有人成功识别了活动/片段泄漏,以及如何在内存分析工具上显示。
<layout>
...

    <include layout="id/sub_layout"
        bind:viewModel="@{viewModel} />
...
</layout>
<layout>
...
    <merge>
        <TextView/>
        <ImageView/>
    </merge>
...
</layout>