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

时间:2011-11-17 22:08:34

标签: 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);
}

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

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

    ...
}

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

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

2 个答案:

答案 0 :(得分:1)

我不记得详细信息,但至少使用兼容性库,如果你不从initLoader()调用onCreate(),加载器的生命周期会搞砸,所以你可能想调用它们来自onCreate()(可能在最新版本中修复,尚未测试)。 IIRC,片段只使用活动的LoaderManager,因此加载器总是由活动管理。使用片段通常会使您的代码更清晰,因此如果可能,请迁移到片段。

答案 1 :(得分:1)

由于您已经使用了碎片,我建议您在视图寻呼机中使用碎片。我这样做,效果更好。那么你确实会为每个片段初始化一个加载器。如果这些片段是相关的,你可以定义抽象扩展并将常用的初始化逻辑放在那里,然后你可以扩展它以创建一个具体的片段

在上面的代码中,我发现即使ID不同,每个后续加载器的初始化也会取消前一个加载器的执行