2017-04-18 73 views
0

在我的情況下,在設置我的應用程序,我點擊按鈕更新數據庫,它顯示dialogFragment的進展,如果我點擊主頁按鈕 - 我的應用程序崩潰。在更新數據期間點擊Home時出現崩潰並顯示dialogFragment。 IllegalStateException

登錄錯誤:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
                     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1489) 
                     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1507) 
                     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) 
                     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613) 
                     at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:201) 
                     at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:167) 
                     at com.guardian.glass.ui.settings.SettingsActivity$6.onComplete(SettingsActivity.java:328) 
                     at com.guardian.glass.ui.DialogProgressFragment$1.onDataLoaded(DialogProgressFragment.java:63) 

在方法,其中彈出錯誤,我的課SettingsActivity代碼。

private void fetchDatabaseFromServer() { 
     UserOperationsTask getCountriesTask = new UpdateCountries(new DialogProgressFragment() { 
      @Override 
      public void onComplete(boolean success) { 
       dismiss(); // here i get error 
       updateDatabaseSize(); 
       updateFilters(); 
       MeasureUtils.makeDefaultTemplate(SettingsActivity.this, true); 
      } 
     }); 
     getCountriesTask.execute(SettingsActivity.this); 
     showProgress(); 
     updateDataBaseProfile(); 
    } 

我的內部類

private class UpdateCountries extends UserOperationsTask { 
     final DialogProgressFragment progressDialog; 

     UpdateCountries(DialogProgressFragment progressDialog) { 
      super(UserOperationsTask.TaskMode.MODE_LOAD_COUNTRIES, null); 
      this.progressDialog = progressDialog; 
     } 

     @Override 
     public void onLoadFinished(Bundle resultData) { 
      setRegionLabels(); 
      updateFilters(); 
      hideProgress(); 
      String errorMessage = resultData.getString(UserOperationsTask.RESULT_ERROR_STRING); 
      if (errorMessage != null) { 
       Log.d(TAG, "getCountriesFromServer error: " + errorMessage); 
       showMessage(getString(R.string.info_title), getString(R.string.server_request_error)); 
      } else { 
       progressDialog.start(SettingsActivity.this, DialogProgressFragment.DialogMode.MODE_UPDATE); 
       progressDialog.setCancelable(false); 
       progressDialog.show(getSupportFragmentManager(), DialogProgressFragment.class.getSimpleName()); 
      } 
     } 
    } 

請告訴我如何更好地解決這個問題?

+0

嘗試把更新過程在後臺服務通知UI使用的廣播接收機。 –

回答

1

謝謝你們!我瑤池的解決方案 - 在我的情況,而不是

dismiss(); 

更好地利用

dismissAllowingStateLoss(); 
0

請注意,如果在停止之後更新ui,應用程序將自動崩潰。 所以,如果你是異步更新應用程序的用戶界面,請確保他們是一些機制,檢測您的活動不是在onstop狀態。

或者你可以在dialogfragment類中改變提交commitAllowingStateLoss。

0

使用commitAllowingStateLoss()而不是commit()。如果發生狀態丟失,它不會拋出異常。

相關問題