1、先来看异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.Locale.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.updateLocaleListFromAppContext(ActivityThread.java:5518)
at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:5100)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6662)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
2、简要分析:
大概意思就是你设置了字体国际化的代码,但是启动时并没有获取到资源导致了空指针。
3、修改:
3.1、 先找代码:
@Override
public Resources getResources() {
Resources resources = super.getResources();
Configuration configuration = resources.getConfiguration();
configuration.setToDefaults();
return resources;
}
这是一段设置app不随着系统字体的调整而变化的代码,大概位置在重写的Application或者BaseActivity里(找不到的直接全局搜,Ctrl + Shift + R)
如果没搜到就不用往下看了!
3.2、找到了之后就替换为下面的代码
@Override
public Resources getResources() {
Resources resources = super.getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (null != resources && configuration.fontScale != 1) {
configuration.fontScale = 1;
if (Build.VERSION.SDK_INT >= 17) {
Context configurationContext = createConfigurationContext(configuration);
resources = configurationContext.getResources();
displayMetrics.scaledDensity = displayMetrics.density * configuration.fontScale;
} else {
resources.updateConfiguration(configuration, displayMetrics);
}
}
return resources;
}
4、吐个小槽:
用原来的代码,测试时部分手机好用,部分手机无法启动,异常信息展示定位不够精准,多少被恶心了一小下。
共同学习! 共勉!