在Android 8上使用android数据绑定时应用程序崩溃

Far*_*rov 9 android android-databinding android-8.0-oreo android-8.1-oreo

该代码适用于pre-oreo设备,但Crashlytics称它在Android 8设备上崩溃

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getAppComponent().inject(this);
        binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
    }
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'int android.view.ViewGroup.getChildCount()'

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
       at android.databinding.DataBindingUtil.bindToAddedViews(DataBindingUtil.java:295)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:279)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261)
       at com.myapp.MyActivity.onCreate(MyActivity.java:59)
       at android.app.Activity.performCreate(Activity.java:7174)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6940)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Run Code Online (Sandbox Code Playgroud)

pel*_*lus 11

在8上具有完全相同的堆栈跟踪的类似崩溃.

你尝试过使用过:

binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity, null, false);
setContentView(binding.getRoot());
Run Code Online (Sandbox Code Playgroud)

上面的代码和调用之间的区别

DataBindingUtil.setContentView(...);
Run Code Online (Sandbox Code Playgroud)

是直接inflate()返回一个View后来传递给DataBindingUtils::bindToAddedViews.如果DataBindingUtil.setContentView使用以下逻辑

activity.setContentView(layoutId);
View decorView = activity.getWindow().getDecorView();
ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);
Run Code Online (Sandbox Code Playgroud)

而且似乎

ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);
Run Code Online (Sandbox Code Playgroud)

只是NULL......

  • 有关信息,请报告给Google:https://issuetracker.google.com/issues/71885063。它被关闭为“无法修复/不可复制”。似乎开发人员在报告故障时正在崩溃报告(crashlytics,Play商店控制台)中看到它,但是很难复制它。在我们的应用中,这是我们的主要崩溃报告。 (2认同)