1

新しいGoogleMapsV2を使用するアプリを実行しています。マップカメラが移動すると、ポイントを新しいカメラ位置にリロードする必要があります。非同期タスクを使用して実行します。

問題は、カメラの位置を複数回移動すると、アプリがポイントを複数回ロードすることです。そのため、カメラを動かしたときに非同期タスクをキャンセルし、タスクがキャンセルされるまで新しいポイントをロードしません。私はそれを行うための空の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 に答える