来自 AppCompatDelegateImplV7.createSubDecor() 的间歇性 NullPointerException
Intermittent NullPointerException from AppCompatDelegateImplV7.createSubDecor()
我看到了下面的崩溃(通过 Crashlytics),但无法确定原因或重现崩溃。它出现在各种设备和 Android 版本上。该应用程序使用 appcompat-v7:23.2.1。还有其他人看到吗?
如您所见,崩溃发生在 HomeActivity
的 onCreate()
方法中,它扩展了 android.support.v7.app.AppCompatActivity
。在 AppCompatDelegateImplV7.createSubDecor
中,对 mWindow.findViewById(android.R.id.content)
的调用有时 returns 为空。这反过来导致第 475 行出现 NullPointerException。对我来说,这有点像 appcompat 代码中的竞争条件。
同样的崩溃发生在另一个 Activity 中,并且都使用 CoordinatorLayout 作为它们的根布局元素。这个元素是在崩溃开始出现的时候引入的,所以我不禁想知道是否有联系。
这里是堆栈的相关部分:
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:475)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.bleacherreport.android.teamstream.activities.HomeActivity.onCreate(HomeActivity.java:181)
Chris Banes 提出了一个解决方法:在 Activity 的 onCreate()
方法中,在调用 super.onCreate()
之前添加对 getWindow().getDecorView()
的调用。此解决方法的初步测试非常有希望。
代码最终看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState) {
// Workaround for issue reported to Google: https://code.google.com/p/android/issues/detail?id=207638
// Making this call here causes the content view to be populated, avoiding the occasional crashes due
// to null content view when calling setContentView() below.
getWindow().getDecorView();
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity); // <-- Your Activity layout here
...
}
更新:部署此解决方法后,我们现在看到此崩溃的发生次数为零。
更新:此错误在 23.4.0 中 reported fixed。
我看到了下面的崩溃(通过 Crashlytics),但无法确定原因或重现崩溃。它出现在各种设备和 Android 版本上。该应用程序使用 appcompat-v7:23.2.1。还有其他人看到吗?
如您所见,崩溃发生在 HomeActivity
的 onCreate()
方法中,它扩展了 android.support.v7.app.AppCompatActivity
。在 AppCompatDelegateImplV7.createSubDecor
中,对 mWindow.findViewById(android.R.id.content)
的调用有时 returns 为空。这反过来导致第 475 行出现 NullPointerException。对我来说,这有点像 appcompat 代码中的竞争条件。
同样的崩溃发生在另一个 Activity 中,并且都使用 CoordinatorLayout 作为它们的根布局元素。这个元素是在崩溃开始出现的时候引入的,所以我不禁想知道是否有联系。
这里是堆栈的相关部分:
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:475)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.bleacherreport.android.teamstream.activities.HomeActivity.onCreate(HomeActivity.java:181)
Chris Banes 提出了一个解决方法:在 Activity 的 onCreate()
方法中,在调用 super.onCreate()
之前添加对 getWindow().getDecorView()
的调用。此解决方法的初步测试非常有希望。
代码最终看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState) {
// Workaround for issue reported to Google: https://code.google.com/p/android/issues/detail?id=207638
// Making this call here causes the content view to be populated, avoiding the occasional crashes due
// to null content view when calling setContentView() below.
getWindow().getDecorView();
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity); // <-- Your Activity layout here
...
}
更新:部署此解决方法后,我们现在看到此崩溃的发生次数为零。
更新:此错误在 23.4.0 中 reported fixed。