2013-02-14 40 views
1

我在做一個應用程序,它使用新的Google Maps V2,當地圖相機移動時,我需要將點重新加載到新的相機位置,我用一個asynctask來完成。如何取消一個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); 
} 

回答

0

其實,我不認爲你的while循環會起作用,或者至少不像你所期望的那樣。 AsyncTask.isCancelled()方法通常用內部的 doInBackground()方法來支持提前取消。你有幾種選擇去做你想做的事:

  • 重寫你的AsyncTask的onCancelled()方法。當你的doInBackground()完成並且你事先調用了你的任務的cancel()時,這保證在主線程上調用。在你的onCancelled()中,你可以開始一個新的AsyncTask。如上所述,在任務的doInBackground()中使用isCancelled()以提前退出。
  • 不取消當前任務,但讓它運行。同時用戶可以多次移動地圖。只要任務仍在運行,只需設置一個應重新運行的標誌即可。在任務完成時(在AsyncTask中重寫onPostExecute()),檢查標誌並重新設置。
  • 結合上述內容以在響應性(開始快速加載正確的POI)和過度處理(不要每次都開始,但等待用戶停止滾動)之間找到合適的平衡點。