与viewpager一起使用异步任务时的竞争条件

时间:2016-08-21 14:13:49

标签: android android-fragments android-asynctask

我有一个使用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 个答案:

答案 0 :(得分:0)

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

public interface DataListener{
  public void onDataReceived();
}

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