当ViewPager快速滑动时,避免执行AsyncTask

时间:2016-03-23 20:16:33

标签: android android-fragments android-asynctask android-viewpager jsoup

我正在使用ViewPager来显示使用jsoup从网站上获取的内容。 在每个页面的onCreateView中,我调用AsyncTask来获取数据,并为每个页面更新View

问题在于,当用户比平时更快地滑动页面时,AsyncTask被多次调用,因此,使用jsoup进行了几次无用的请求,因为唯一有用的是最后一次。

我尝试在setUserVisibleHint类上使用Fragment并在setOnPageChangeListener类中添加Activity,但这些方法让我失去了预加载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; } }

"\"121.29\""
"\"288.1\""
"\"120\""
"\"V132.3\""
"\"800\""

2 个答案:

答案 0 :(得分:1)

我认为最好的方法就是检查AsyncTask是否正在运行。存储对AsyncTask的引用,然后如果用户滚动回此页面,您可以使用AsyncTask.Statushttp://developer.android.com/reference/android/os/AsyncTask.Status.html)检查其状态。

此外,如果您想在用户滚动速度过快时避免启动新任务,则可以使用handler.postDelayed(yourRunnable, longMs)。每次用户选择页面时,您都可以执行以下操作:

handler.removeCallbacks(yourRunnable);
handler.postDelayed(yourRunnable, longMs);

这样,您将删除之前的待处理任务,并在longMs时间内安排新任务。例如。如果您输入1000毫秒,那么您的任务将在用户选择页面后的一秒内开始。

答案 1 :(得分:0)

您可能希望延迟获取内容的请求。例如,如果您快速滑动,等待半秒钟来加载内容(而不是立即加载)将使系统有机会呼吸并检查页面是否仍然可见。

这样的事情:

handler.postDelayed(new Runnable(){
    if (isVisible){
        new GetPageTask(url).execute();
    }
}, 500);