我有一个调用异步任务的Fragment,当结果返回时,提交一个fragmentTransaction。
但是,由于操作系统调用片段的onStop()函数,有时会返回一个illegalState异常,如here和here所示。
对此的解决方案是简单地将事务移动到onResume()函数中,在该函数中保证片段的状态被恢复。
然而,这又产生了另一个问题:当片段没有停止时,我必须等待onResume()函数在显示新片段之前被调用。
我提出的一个解决方案是捕获illegalState异常,并且只有当异步函数中的那个失败时才会在onResume()函数中提交(如下所示),但它看起来不必要长而且不智能。有关更智能代码的任何提示或想法?我刚刚开始为Android编程,所以我很可能错过了一些东西..
代码看起来像这样:
@Override
public void asyncTaskResult(JSONObject obj) {
//pre-transaction instructions
try{
TestFragment test = new TestFragment();
Bundle bundle = new Bundle();
bundle.putString("testvar", obj.optString("testvar", null));
test.setArguments(bundle);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.testcontainer, test);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
catch(illegalStateExeption e){
//if failed, save data and turn on flag
mCommitOnResume = true;
mJSONObj = obj;
}
@Override
Public void onResume(){
super.onResume();
//if commit on asyncTaskResult fails, do it here
if(mCommitOnResume){
TestFragment test = new TestFragment();
Bundle bundle = new Bundle();
bundle.putString("testvar", mJSONObj.optString("testvar", null));
test.setArguments(bundle);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.testcontainer, test);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
mCommitOnResume = false;
}
非常感谢任何想法/提示/建议。
答案 0 :(得分:0)
试试这个
ft.commitAllowingStateLoss()
代替ft.commit()
<强>例如强>
TestFragment test = new TestFragment();
Bundle bundle = new Bundle();
bundle.putString("testvar", obj.optString("testvar", null));
test.setArguments(bundle);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.testcontainer, test);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commitAllowingStateLoss();