单个活动中的多个AsyncTaskLoader - 是否必须在onCreate中初始化每个加载器?

NPi*_*ike 6 android android-viewpager

我有一个带有ViewPager的FragmentActivity - 这个ViewPager包含三个ListView - 每个ListView都有自己独特的适配器(和唯一的数据集).

我想使用AsyncTaskLoader来填充这些适配器,但仅限于在ViewPager中选择给定视图时.

是否需要在activity的onCreate方法中初始化一个加载器?(下面的代码)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foo);

    getSupportLoaderManager().initLoader(0, null, this);
    getSupportLoaderManager().initLoader(1, null, this);
    getSupportLoaderManager().initLoader(2, null, this);
}
Run Code Online (Sandbox Code Playgroud)

或者可以交互式地调用initLoader(...),例如OnPageChangeListener.onPageSelected的监听器的结果?

mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int newPage) {
        getSupportLoaderManager().initLoader(newPage, null, this);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果用户可能只查看寻呼机中的第一个视图,我想避免必须预先执行3个耗时的加载器.

编辑: 或者让ViewPager为每个视图使用Fragment是一个更好的设计,每个片段都负责管理自己的加载器?

Nik*_*kov 1

我不记得细节了,但至少对于兼容性库,如果你不调用initLoader()from onCreate(),加载器的生命周期就会变得混乱,所以你可能想调用它们 from onCreate()(可能在最新版本中修复了,还没有t 测试)。IIRC,片段仅使用活动的LoaderManager,因此加载器始终由活动管理。使用片段通常会让你的代码更干净,所以如果可能的话请迁移到片段。