如何取消asyncTask并多次执行?

时间:2013-02-14 11:20:25

标签: android

我正在做一个使用新版Google Maps V2的应用,当地图相机移动时,我需要将点重新加载到新的相机位置,我用asynctask做。

问题是当我多次移动相机位置时,应用程序将点数加载倍数。因此,我在移动相机时取消了异步任务,并且在取消任务之前我没有加载新点。我有一个空的while循环来做它,有没有更好的解决方案呢?

// LOAD NEW POIS ASYNC
private void updatePoisInMap( ){

     ....

     if (refresh_pois_async != null) {
        refresh_pois_async.cancel(true);
        while (!refresh_pois_async.isCancelled()) {
        }    
     }
     refresh_pois_async = new RefreshPoisAsync( ).execute( lowerLeftCorner, topRightCorner);
}

1 个答案:

答案 0 :(得分:0)

实际上,我认为你的while循环不起作用,或者至少不像你期望的那样。 AsyncTask.isCancelled()方法通常在doInBackground()方法中使用 inside ,以支持提前取消。您有多种选择可以做您想做的事情:

  • 覆盖AsyncTask的onCancelled()方法。当doInBackground()完成并且事先在您的任务上调用cancel()时,可以保证在主线程上调用它。在你的onCancelled()中,你可以启动一个新的AsyncTask。如上所述,在Task的doInBackground()中使用isCancelled()进行提前退出。
  • 不要取消当前任务,而是让它运行。同时,用户可以多次移动地图。只要任务仍在运行,只需设置一个应该重新运行的标志。在任务完成时(在AsyncTask中覆盖onPostExecute())检查标志并重新开始(如果已设置)。
  • 结合上述内容,找到响应能力(开始加载足够快的POI)和过度处理之间的正确平衡(不要每次都开始,而是等待用户停止滚动)。
相关问题