如何控制Fragment和FragmentPagerAdapter的生命周期

时间:2012-04-02 09:35:44

标签: android lifecycle fragment

我正在试图弄清楚当与FragmentPagerAdapter结合使用时,是否有一种控制片段生命周期的方法。

我的目标是在用户将其滑入视图时触发当前可见片段的AsyncTask。

截至目前,我只能创建一个应用程序,当运行FragmentPagerAdapter代码时,实例化我希望可用的所有片段,同时完成每个片段的“完整启动生命周期”。

我希望Fragment的AsyncTask在Fragment进入视图时被触发,当它离开视图时取消它。我试图覆盖每个片段上的所有可用回调,但我还没有找到一个回调或监听器,当显示/未显示特定片段时会做出反应。

我正在使用Android支持包v4,并将ViewPager作为应用程序的基础。

1 个答案:

答案 0 :(得分:3)

您可能正在寻找.setOnPageChangedListener() - 方法。在适配器中调用mViewPager.setOnPageChangedListener(new OnPageChangedListener() { ... })implement ViewPager.OnPageChangedListener(并设置mViewPager.setOnPageChangedListener(mAdapter))。

onPageSelected() - 方法中,执行asynctask并取消之前的所有实例。这样,当您的页面(完全)可见时,您的asynctask将被执行。如果您想在用户开始滚动时立即执行它,请改为操纵onPageScrollStatechanged()onPageScrolled() - 方法。

示例:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

    @Override
    public void onPageScrollStateChanged(int state) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageSelected(int position) {

        // check if asyncTask exists and is running; if so, cancel it.
        if(mAsyncTask != null) {

            if(mAsyncTask.getStatus() != AsyncTask.Status.FINISHED) {
                mAsyncTask.cancel(true); // cancel asynctask if activity is destroyed before it's finished
            }

            mAsyncTask = null;
        }

        mAsyncTask = new MyAsyncTask().execute("myParam"); 
    }

});