0

는 IS 다음 내 스택 추적 후이 작업을 수행 할 수 없습니다 :는 onSaveInstanceState

여기
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(); 
     } 

대화 상자가 뷰 호출기를 포함하는 단편 :

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) 

이 내 코드입니다.

문제는 한 번만 나타났습니다. 내가 어떻게 고칠 수 있는지 알려줘.

답변

0

IllegalStateException은 부적절한 시간에 메소드를 호출 할 때 발생합니다.

매우 일반적인 방법은 네트워크 호출을 호출하고 콜백에서 조각 트랜잭션을 트리거하는 경우입니다. 네트워크 통화가 완료되면 앱이 최소화 된 경우 IllegalStateException이 표시됩니다. 일부 비동기 콜백에서이 트랜잭션을 수행해야한다고 생각합니다.

해결 방법은 트랜잭션을 수행하기 전에 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 
      } 
     }) 
    } 
}