1

我正在做一个使用新的 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);
}
4

1 回答 1

0

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

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