app無法啓動,boolean java.util.Locale.equals(java.lang.Object) on a null object reference。

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、吐個小槽:

用原來的代碼,測試時部分手機好用,部分手機無法啓動,異常信息展示定位不夠精準,多少被噁心了一小下。

共同學習! 共勉!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章