錯誤處理Class not found when unmarshalling: android.support.v4.app.FragmentManagerState

一開始谷歌找遍了全網 , 直接搜這個報錯貌似沒有解決方法 T_T
希望這篇文章能夠幫到各位啦.
解決方法拉到文末.

報錯日誌:

E/Parcel: Class not found when unmarshalling: android.support.v4.app.FragmentManagerState
    java.lang.ClassNotFoundException: android.support.v4.app.FragmentManagerState
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:309)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
        at android.os.Parcel.readParcelable(Parcel.java:2245)
        at android.os.Parcel.readValue(Parcel.java:2152)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
        at android.os.BaseBundle.unparcel(BaseBundle.java:221)
        at android.os.Bundle.getParcelable(Bundle.java:755)
        at android.app.Activity.onCreate(Activity.java:932)  //可以看到是在onCreate的時候,進行恢復操作,導致Exception
        at android.app.Activity.performCreate(Activity.java:5990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at com.duowan.gamecenter.pluginlib.a.abk.callActivityOnCreate(DelegateInstrumentation.java:239)
        at com.duowan.gamecenter.pluginlib.environment.abo.callActivityOnCreate(PluginInstrumentation.java:162)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

背景:
項目中的Activity是基於FragmentActivity, 當手機/模擬器的內存不足時(日誌:E/History: low memory), 後臺的活動被回收 ,只保留任務棧,再次進入的時候, Activity嘗試恢復 , 出現該崩潰 .

FragmentActivity的onSaveInstanceState源碼:

    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        this.markFragmentsCreated();
        Parcelable p = this.mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable("android:support:fragments", p);
        }

        if (this.mPendingFragmentActivityResults.size() > 0) {
            outState.putInt("android:support:next_request_index", this.mNextCandidateRequestIndex);
            int[] requestCodes = new int[this.mPendingFragmentActivityResults.size()];
            String[] fragmentWhos = new String[this.mPendingFragmentActivityResults.size()];

            for(int i = 0; i < this.mPendingFragmentActivityResults.size(); ++i) {
                requestCodes[i] = this.mPendingFragmentActivityResults.keyAt(i);
                fragmentWhos[i] = (String)this.mPendingFragmentActivityResults.valueAt(i);
            }

            outState.putIntArray("android:support:request_indicies", requestCodes);
            outState.putStringArray("android:support:request_fragment_who", fragmentWhos);
        }
    }

恢復的時候 , 會在super.onCreate(savedInstanceState);嘗試恢復 , 導致出現本文的錯誤:Class not found when unmarshalling: android.support.v4.app.FragmentManagerState

解決思路就是處理savedInstanceState,不讓它恢復android:support:fragments的內容.

解決方法如下:

在activity的onCreate移除掉Bundle 裏的fragments

    @Override
    public void onCreate(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            savedInstanceState.remove("android:support:fragments");
        }
        super.onCreate(savedInstanceState);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章