如何根据异步请求的结果更改片段

时间:2016-01-08 15:13:29

标签: android android-fragments android-asynctask loader asynctaskloader

我想根据对本地数据库的异步请求的结果来管理屏幕上的片段。 E.g:
1.转到数据库
2.获得结果
3.交付结果后,选择应向用户显示的片段 (如下面的代码中所示)。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getLoaderManager().restartLoader(0, null, new LoaderManager.LoaderCallbacks<Boolean>() {
        @Override
        public Loader<Boolean> onCreateLoader(int id, Bundle args) {
            return new MyLoader(MainActivity.this);
        }

        @Override
        public void onLoadFinished(Loader<Boolean> loader, Boolean data) {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            if (data) {
                fragmentTransaction.add(new MyFragment1(), null);
            } else {
                fragmentTransaction.add(new MyFragment2(), null);
            }
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }

        @Override
        public void onLoaderReset(Loader<Boolean> loader) {
        }
    });
}

private static class MyLoader extends AsyncTaskLoader<Boolean> {

    public MyLoader(Context context) {
        super(context);
    }

    @Override
    public Boolean loadInBackground() {
        try {
            Thread.sleep(1000); //Let's pretend we are looking for something in local db
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return (System.currentTimeMillis() % 2) == 0; // return true or false randomly
    }
}
}

结果,我得到:
java.lang.IllegalStateException:无法在onLoadFinished中执行此操作

我可以欺骗原因系统并将片段事务包装到runnable中并在处理程序上调用它,但似乎我仍然会得到一个例外,即saveInstanceState()调用和onStop之间将传递加载器结果( )。 我无法使用&#34; commitAllowingStateLoss&#34;方法,因为我依赖我的片段的有效堆栈,我不希望它被弄乱。

有人可以建议如何以正确的方式做到这一点吗?

0 个答案:

没有答案