使用带有 viewpager 的异步任务时的竞争条件

Posted

技术标签:

【中文标题】使用带有 viewpager 的异步任务时的竞争条件【英文标题】:Race condition while using async task with viewpager 【发布时间】:2016-12-28 03:45:24 【问题描述】:

我有一个使用 viewpager 的屏幕,其中包含两个片段 A 和 B,片段中的数据是使用异步任务加载的。我的 MainActivity 类在 onCreate 方法中包含以下代码:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
pager = (ViewPager) findViewById(R.id.pager);
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
tabLayout.setupWithViewPager(pager);
//Async task to get data from server and update the fragments
runGetDataTask(true);

/**
 * Adapter class for View pager
 */
public class MyPagerAdapter extends FragmentPagerAdapter 

    private final String[] TITLES = "A",
            "B";

    public MyPagerAdapter(FragmentManager fm) 
        super(fm);
    

    @Override
    public CharSequence getPageTitle(int position) 
        return TITLES[position];
    

    @Override
    public int getCount() 
        return TITLES.length;
    

    @Override
    public Fragment getItem(int position) 
        switch (position) 

            case 0:
                iFragment = A.getInstance();
                if (Utility.IS_DEBUG)
                    Log.i(LOG_TAG,"A fragment created");
                return iFragment;
            case 1:
                dFragment = B.getInstance();
                if (Utility.IS_DEBUG)
                    Log.i(LOG_TAG,"B fragment created");
                return dFragment;
        
        return null;
    


问题在于,有时异步任务在片段初始化之前完成执行,当它尝试访问 iFragment 和 dFragment 以更新其从服务器获得的数据时,我得到了 nullpointerexception,因为片段尚未初始化。

但这有时会发生,我不知道我在这里做错了什么。有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

【参考方案1】:

我认为一种可能的解决方法是确保在 AsyncTask 完成其工作后初始化 ViewPager。这可以通过创建如下监听器来实现:

public interface DataListener
  public void onDataReceived();

并将其提供给 AsyncTask(您的活动必须实现此接口)。当 AsyncTask 完成其工作时,将调用侦听器并将控制权转移回可以初始化 UI 的 Activity。

【讨论】:

@user818455 有帮助吗? 我仍然不明白您的解决方案将如何解决我的问题?哪些代码将确保 viewpager 片段已初始化且不为空?

以上是关于使用带有 viewpager 的异步任务时的竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

viewpager 内无法解释的 ListFragment 行为

带有 SlidingTabLayout 的 ViewPager 中的 Listview - 高度问题

返回 Firebase 用户名时的 iOS 异步任务问题

带有自定义列表的进度条

使用 ViewPager + NestedScrollView + RecyclerView 时的触摸事件拦截