我正在使用 ViewPager
显示使用 jsoup 从网站获取的内容。
在每个页面的 onCreateView
中,我调用一个 AsyncTask
来获取数据并更新每个页面的 View
。
问题是,当用户滑动页面的速度比平常快时,AsyncTask
被调用了几次,因此,jsoup 发出了几个无用的请求,因为唯一有用的是最后一个。
我尝试在 Fragment
类上使用 setUserVisibleHint
并在 Activity
类中添加 setOnPageChangeListener
但这些方法使我失去了预加载下一页的 ViewPager
行为,我不想这样。
有没有办法知道用户什么时候停止滑动,只在那一刻调用AsynTask
?
public class ScreenSlidePageFragment extends Fragment {
public static final String PAGE_NUMBER = "page";
private int mProblemNumber;
public static ScreenSlidePageFragment create(int pageNumber) {
ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
Bundle args = new Bundle();
args.putInt(PAGE_NUMBER, pageNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = getArguments().getInt(PAGE_NUMBER);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_screen_slide_page, container, false);
new GetPageTask(url).execute();
return rootView;
}
}
最佳答案
我认为最好的方法就是检查 AsyncTask
是否正在运行。存储对您的 AsyncTask
的引用,然后如果用户滚动回此页面,您可以使用 AsyncTask.Status
( http://developer.android.com/reference/android/os/AsyncTask.Status.html ) 检查其状态。
另外,如果你想避免在用户滚动太快时启动新任务,你可以使用handler.postDelayed(yourRunnable, longMs)
。每次用户选择一个页面时,您都可以执行以下操作:
handler.removeCallbacks(yourRunnable);
handler.postDelayed(yourRunnable, longMs);
这样您将删除以前的待处理任务并在 longMs
时间内安排一个新任务。例如。如果您设置 1000 毫秒,那么您的任务只会在用户选择页面后的一秒钟内开始。
关于android - 避免ViewPager快速滑动时执行AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187904/