我正在使用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\""
答案 0 :(得分:1)
我认为最好的方法就是检查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毫秒,那么您的任务将在用户选择页面后的一秒内开始。
答案 1 :(得分:0)
您可能希望延迟获取内容的请求。例如,如果您快速滑动,等待半秒钟来加载内容(而不是立即加载)将使系统有机会呼吸并检查页面是否仍然可见。
这样的事情:
handler.postDelayed(new Runnable(){
if (isVisible){
new GetPageTask(url).execute();
}
}, 500);