0

Ниже мой стек трассировки:Невозможно выполнить это действие после того, как onSaveInstanceState

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) 
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613) 

Это мой код:

dialog = FeedDialog.getInstance(feedViewModels, this, false, this); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     if (fragmentManager != null && !isFinishing()) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.add(R.id.fragment_content, dialog); 
      ft.addToBackStack("unread_feeds"); 
      ft.commit(); 
      fragmentManager.executePendingTransactions(); 
     } 

Здесь диалог представляет собой фрагмент, который содержит вид пейджера.

Вопрос появился только один раз. Дайте мне знать, как я могу это исправить.

ответ

0

IllegalStateException возникает, когда вы вызываете метод в неподходящее время.

Очень распространенный способ, когда это появляется, - это то, где вы вызываете сетевой вызов и запускаете транзакцию фрагмента в обратном вызове. Если приложение сведено к минимуму при завершении сетевого вызова, вы должны получить IllegalStateException. Я думаю, что вы должны выполнить эту транзакцию в некотором обратном вызове async.

Решение должно добавить проверку isResumed() перед выполнением транзакции. Если isResumed() возвращает false, вам нужно будет поставить очередь на транзакцию после того, как приложение будет возобновлено. Вы можете иметь вспомогательный метод в своем фрагменте (или BaseFragment), который поддерживает список объектов Runnable и выполняет их в onResume.

List<Runnable> pendingJobsOnResume; 
public void executeOnResume(Runnable runnable) { 
    if (isResumed()) { 
     runnable.run(); 
    } else { 
     pendingJobsOnResume.add(runnable); 
    } 
} 

// And invoke them in onResume 
void onResume() { 
    super.onResume(); 
    for (Runnable runnable : pendingJobsOnResume) { 
     runnable.run(); 
    } 
    pendingJobsOnResume.clear(); 
} 

Затем в обратном вызове, вы можете передать код транзакции через работоспособной в executeOnResume вместо прямого вызова.

someAsyncTask(new Callback() { 
    void call() { 
     // do common stuff. 

     executeOnResume(new Runnable() { 
      void run() { 
       // fragment transaction 
      } 
     }) 
    } 
}