2017-04-18 70 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()。如果发生状态丢失,它不会抛出异常。

相关问题