首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在安卓ViewPager上加载重任务的正确方法是什么?

在安卓ViewPager上加载重任务的正确方法是什么?
EN

Stack Overflow用户
提问于 2013-06-20 04:09:58
回答 2查看 1.1K关注 0票数 0

作为查看器预加载其中使用的片段的+1和-1。我有一个使用asyntask的数据加载,我希望只有当我在页面本身时才执行。

我应该在哪里执行这个函数?oncreate似乎对我不起作用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 04:43:14

Tanis提供的解决方案应该是有效的,但是有人认为应该考虑到这一点。由于AsyncTask是从Activity启动的,因此在处理配置更改时可能会遇到一些问题。也许直接从片段开始AsyncTask会更有意义。

那么解决方案将是使当前显示的片段意识到他是现在显示的片段。

首先,您的活动中应该有一个方法,该方法将从ViewPager返回当前片段的位置

代码语言:javascript
运行
复制
public class MainActivity extends Activity{

   //....
   public int getViewPagerCurrentIndex() {
    return pager.getCurrentItem();
   }
}

其次,在getItem()方法的PagerAdapter中,将当前项的位置作为参数传递给片段:

代码语言:javascript
运行
复制
public class MyPagerAdapter extends FragmentStatePagerAdapter {
    //....

    @Override
    public Fragment getItem(int position) {
        return MyFragment.newInstance(position);
    }
}

最后,在MyFragment中检查从MainActivity返回的位置和实例化片段时收到的位置是否匹配。如果它们匹配,则此片段实例可见:

代码语言:javascript
运行
复制
public static MyFragment newInstance(int position) {
    MyFragment fragment = new MyFragment ();
    Bundle args = new Bundle();
    args.putInt(KEY_POSITION, position);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   setRetainInstance(true);
   if (getArguments() != null) {            
    fragmentPosition = getArguments().getInt(KEY_POSITION);
   }
}

// It does not matter where this method is called, the AsyncTask will be started only for the currently visible fragment.
private void executeAsyncTask(){
    MainActivity mainActivity = (MainActivity)getActivity();
    if (mainActivity.getViewPagerCurrentIndex() == fragmentPosition ) {
        new MyAsyncTask().execute();
   }
}
票数 1
EN

Stack Overflow用户

发布于 2013-06-20 04:16:33

您可以实现ViewPager.OnPageChangeListener并在onPageSelected()中运行您的AsyncTask。

例如:

代码语言:javascript
运行
复制
public class MyActivity implements ViewPager.OnPageChangeListener {
    @Override
    public void onPageSelected(int position) {
        new MyAsyncTask().execute();
    }
}

然而,正如Tyczj在评论中指出的那样,这违背了ViewPager试图保持视图加载的目的。此功能旨在使您的应用程序看起来流畅,没有它,当您加载数据时,您的视图将看起来为空(或呈现其默认外观)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17200369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档