避免在OnScrollChangedListener中调用两次AsyncTask

时间:2014-05-03 22:07:45

标签: android android-asynctask android-scrollview

我有一个OnScrollChangedListener来控制视图是否对屏幕可见,然后在从ScrollView中删除侦听器后调用asynctask:

scrollView = (ScrollView) findViewById(R.id.scrollView);
scrollListener = new OnScrollChangedListener() {

    @Override
    public void onScrollChanged() {
        Rect scrollBounds = new Rect();
        scrollView.getHitRect(scrollBounds);
        if (spinner.getLocalVisibleRect(scrollBounds)) {
            observer = scrollView.getViewTreeObserver();
            observer.removeOnScrollChangedListener(this);
            new MyTask().execute(null,
                    null, null);
        }
    }
};
observer = scrollView.getViewTreeObserver();
observer.addOnScrollChangedListener(scrollListener);

但我注意到出了问题。事实上,当我滚动和视图变得可见时,如果分支执行两次,那么我的代码调用两次asynctask。现在任务从互联网恢复一些数据,这样,我获得了重复的信息(浪费了3g数据)。 我怎么能只为呼叫任务做一次,所以避免这种行为?

2 个答案:

答案 0 :(得分:1)

Boolean isloading = false; //Instance Variable

在async任务的onPreExecute()中使此标志为true,在onPostExecute()中为false。然后在发出新的执行请求之前检查此标志是否为false;

if(!isLoading){
 new MyTask().execute(null,null, null);

答案 1 :(得分:0)

scrollListener = new OnScrollChangedListener() {

    AsyncTask<?, ?, ?> myTask;

    @Override
    public void onScrollChanged() {
        Rect scrollBounds = new Rect();
        if (spinner.getLocalVisibleRect(scrollBounds)) {
            synchronized (this) {
                if (myTask == null) {
                    observer = scrollView.getViewTreeObserver();
                    observer.removeOnScrollChangedListener(this);
                    myTask = new MyTask().execute(null, null, null);
                }
            }
        }
    }
};