【问题标题】:Intermittent NullPointerException from AppCompatDelegateImplV7.createSubDecor()来自 AppCompatDelegateImplV7.createSubDecor() 的间歇性 NullPointerException
【发布时间】:2016-04-16 03:12:57
【问题描述】:

我已经看到下面的崩溃(通过 Crashlytics),但无法确定原因或重现崩溃。它发生在各种设备和 Android 版本上。该应用程序使用 appcompat-v7:23.2.1。有没有其他人看到它?

如您所见,崩溃发生在HomeActivityonCreate() 方法中,该方法扩展了android.support.v7.app.AppCompatActivity。在AppCompatDelegateImplV7.createSubDecor 内,对mWindow.findViewById(android.R.id.content) 的调用有时会返回null。这反过来会导致第 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)

【问题讨论】:

  • 以下版本的 appcompat-v7 也会发生崩溃:23.1.1; 23.2.0; 23.3.0
  • CoordinatorLayout 似乎与崩溃无关;消除这一点并没有使崩溃消失。奇怪的是,将 Play Services 从 8.4 降级到 7.8 确实使崩溃消失了。由于我无法想象如何有任何直接连接,我不得不假设 Play Services 8.4 会导致时间差异,从而增加触发竞争条件的可能性。
  • 已向 Google 提交问题报告:code.google.com/p/android/issues/…
  • 将 Play Services 从 8.4 降级到 7.8 并不能消除崩溃;它只是降低了频率。
  • Chris Banes 推荐了一种解决方法(请参阅下面的答案),声明了该问题 (code.google.com/p/android/issues/…),并将其标记为在未来的版本中解决。

标签: android android-appcompat


【解决方案1】:

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

【讨论】:

  • 我有同样的错误,但在 23.4.0.1 中没有修复。但这种解决方法有效。
猜你喜欢
  • 2021-04-24
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2014-04-03
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多