Как исправить исключение java.lang.IllegalStateException в onSaveInstanceState

Что может быть причиной этого исключения?

E/AndroidRuntime(16901): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main
E/AndroidRuntime(16901): Процесс: com.borqs.karbonn.music, PID: 16901
E/AndroidRuntime(16901): java.lang.IllegalStateException: Невозможно выполнить это действие после onSaveInstanceState
E/AndroidRuntime(16901): at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1323)
E/AndroidRuntime(16901): at android.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1341)
E/AndroidRuntime(16901): в android.app.BackStackRecord.commitInternal(BackStackRecord.java:609)
E/AndroidRuntime(16901): в android.app.BackStackRecord.commit (BackStackRecord.java:587)
E/AndroidRuntime(16901): на com.borqs.music.MusicHubMainActivity.onNavigationItemSelected(MusicHubMainActivity.java:1167)
E/AndroidRuntime(16901): на com.android.internal .widget.ActionBarView$1.onItemSelected(ActionBarView.java:148)
E/AndroidRuntime( 16901): в android.widget.AdapterView.fireOnSelected(AdapterView.java:893)
E/AndroidRuntime(16901): в android.widget.AdapterView.access$200(AdapterView.java:48)
E/AndroidRuntime (16901): в android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:861)
E/AndroidRuntime(16901): в android.os.Handler.handleCallback(Handler.java:808)
E /AndroidRuntime(16901): at android.os.Handler.dispatchMessage(Handler.java:103)
E/AndroidRuntime(16901): at android.os.Looper.loop(Looper.java:193)
E /AndroidRuntime(16901): at android.app.ActivityThread.main(ActivityThread.java:5299)
E/AndroidRuntime(16901): at java.lang.reflect.Method.invokeNative(собственный метод)
E/ AndroidRuntime(16901): в java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(16901): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java :825 )
E/AndroidRuntime(16901): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)^M
E/AndroidRuntime(16901): на dalvik.system.NativeStart.main (Собственный метод)

Это мой код экземпляра onSave

@Override
public void onSaveInstanceState(Bundle state)
{
    super.onSaveInstanceState(state);
    saveInstance =true;
    if (state == null)
    {
        FragmentManager mFragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
        MediaPlaybackFragment fragment = new MediaPlaybackFragment();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.commit();
    } else {
        state.putInt("position", mPostion);
        selectedTab = tabHost.getCurrentTab();
        state.putInt("tabhostselected", selectedTab);
        state.putBoolean("isSaveInstance", saveInstance);
        // state.putBoolean("draweropened", mDrawergarment.isDrawerOpened());
    }
}

Это мой навигационный код

@Override
public boolean onNavigationItemSelected(int position, long itemId) {
    Fragment newFragment = null;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    newFragment = new MediaPlaybackFragment();
    ft.replace(R.id.content_frame, newFragment, "Music");
    ft.commit();
}

Any help would be much appreciated, if you need more information please ask.

person zzz    schedule 29.10.2014    source источник
comment
И укажите в нем строку MusicHubMainActivity.java:1167.   -  person MysticMagicϡ    schedule 29.10.2014
comment
какой уровень API вы используете?   -  person Amy    schedule 29.10.2014
comment
Это может быть полезно?   -  person Ken Y-N    schedule 29.10.2014
comment
строка № 1167: ft.commit();   -  person zzz    schedule 29.10.2014
comment
@ken Y-N вставленная ссылка относится к библиотеке поддержки v4, но я не использую библиотеки v4   -  person zzz    schedule 29.10.2014
comment
@zzz Это все еще может быть действительным. Пожалуйста, опубликуйте свой код как минимум для com.borqs.music.MusicHubMainActivity.onNavigationItemSelected.   -  person Ken Y-N    schedule 29.10.2014
comment
Пожалуйста, используйте «Ctrl + K» с вашим кодом. Таким образом, код не может быть правильно прочитан.   -  person vkm    schedule 29.10.2014
comment
Пожалуйста, помогите мне найти правильное решение, борющееся с 3 дня.   -  person zzz    schedule 29.10.2014


Ответы (1)


Изменять

fragmentTransaction.commit();

to

fragmentTransaction.commitAllowingStateLoss();

Вероятно, вы фиксируете свою транзакцию где-то еще в своем коде - вы также должны использовать commitAllowingStateLoss(). Но я бы порекомендовал вам переписать свой код, чтобы избежать фиксации после onSaveInstanceState()

person localhost    schedule 29.10.2014
comment
@ localhost, но согласно документации Как и commit(), но позволяет выполнить фиксацию после сохранения состояния активности. Это опасно, потому что фиксация может быть потеряна, если активность впоследствии потребуется восстановить из ее состояния, поэтому это следует использовать только в тех случаях, когда состояние пользовательского интерфейса может неожиданно измениться для пользователя. - person zzz; 29.10.2014
comment
@localhost что скажешь на это - person zzz; 29.10.2014
comment
@zzz, извини, но я не понял твоего вопроса :) - person localhost; 29.10.2014
comment
@ localhost согласно документации commitAllowingStateLoss() похоже, что мы не можем использовать этот commitAllowingStateLoss, есть вероятность потери фиксации - person zzz; 29.10.2014
comment
@zzz, вы не потеряете фиксацию, вы можете потерять состояние (например, это означает, что вы не можете работать с обратным стеком), но транзакция будет зафиксирована, а фрагменты будут заменены или добавлены / удалены. Просто попробуйте. - person localhost; 29.10.2014