恢复 Activity 时崩溃,原因是 NPE(空指针异常)

10

我注意到我的应用程序的一些用户在配置更改和Activity重建时会崩溃,但我无法复现。问题似乎在Android类内部,因此我无法直接修复它。

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'float android.content.res.Configuration.fontScale' on a null object reference
       at android.content.res.Configuration.setTo + 904(Configuration.java:904)
       at android.content.res.Configuration.(Configuration.java:891)
       at android.app.ActivityThread.createNewConfigAndUpdateIfNotNull + 5133(ActivityThread.java:5133)
       at android.app.ActivityThread.performConfigurationChanged + 5203(ActivityThread.java:5203)
       at android.app.ActivityThread.performConfigurationChangedForActivity + 5117(ActivityThread.java:5117)
       at android.app.ActivityThread.handleResumeActivity + 3994(ActivityThread.java:3994)
       at android.app.ActivityThread.handleLaunchActivity + 3070(ActivityThread.java:3070)
       at android.app.ActivityThread.handleRelaunchActivity + 5006(ActivityThread.java:5006)
       at android.app.ActivityThread.-wrap21(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage + 1665(ActivityThread.java:1665)
       at android.os.Handler.dispatchMessage + 102(Handler.java:102)
       at android.os.Looper.loop + 154(Looper.java:154)
       at android.app.ActivityThread.main + 6816(ActivityThread.java:6816)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 1563(ZygoteInit.java:1563)
       at com.android.internal.os.ZygoteInit.main + 1451(ZygoteInit.java:1451)

由于我无法重现它,向Goggle issuetracker提交错误报告可能会相当无用。有人知道这里发生了什么吗?有人遇到过这种情况吗?

显然存在一个错误,因为 ActivityThread#createNewConfigAndUpdateIfNotNull(Configuration, Configuration) 方法负责将一个null值传递给 Configuration#setTo(Configuration),而该方法的第一个参数被注解为@NonNull

崩溃主要发生在Android 7.1.1上,该应用程序的目标SDK是28。


1
你有没有使用自定义字体? - a_local_nobody
@a_local_nobody 不是的。 - devgianlu
你能找出这是为什么吗? 在MainActivity更改方向时,Android 7.0会发生这种情况。 Android 5.1.1没有问题。 此外,仅在应用程序在创建时处于夜间模式时才会发生。 https://github.com/kebiro/TriviaQuiz - Beko
@Beko 不好意思,我没有解决它。 - devgianlu
3个回答

4

这个问题只出现在 Android 7.0 及以上版本中...当应用程序启用夜间模式并且屏幕旋转(配置更改)时,可能是 DayNight 主题中的一个错误。


2
我也在Android 7.1上遇到了这个问题,但我发现我的活动创建了两次,因为在super.onCreate(savedInstanceState)之后调用了setTheme(R.style.custom_style)。当修复此问题时,配置更改后不再发生崩溃。
希望这可以帮助到您。

1

我对这个问题进行了大量的研究,发现这个问题只发生在Android 7和DayNight主题中。 为解决这个问题,在Android 7中不能使用DayNight主题,比如以下代码:

 if (Build.VERSION.SDK_INT==Build.VERSION_CODES.N||Build.VERSION.SDK_INT==Build.VERSION_CODES.N_MR1){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }

通过添加上述代码,我的问题得到了解决。 希望这个解决方案对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接