在onResume中提交fragmentTransaction。聪明的方法解决这个问题?

时间:2014-07-31 10:37:40

标签: android android-fragments fragmenttransaction

我有一个调用异步任务的Fragment,当结果返回时,提交一个fragmentTransaction。

但是,由于操作系统调用片段的onStop()函数,有时会返回一个illegalState异常,如herehere所示。

对此的解决方案是简单地将事务移动到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;
}

非常感谢任何想法/提示/建议。

1 个答案:

答案 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();