1

マップ機能に大きく依存するアプリケーションがあります。runOnFirstFix()最初のアクティビティから、ユーザーの場所が見つかったら、データベースから大量のデータをロードするメソッドを呼び出しますが、このランナブルを中断して、アクティビティを切り替えるときや実行中に停止できるようにしたいユーザーがボタンを押して実行を停止します。

myLocationOverlay.runOnFirstFix(new Runnable() {
            public void run() {
                mc.animateTo(myLocationOverlay.getMyLocation());
                mc.setZoom(15);
                userLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
                userLongitude = myLocationOverlay.getMyLocation().getLongitudeE6();
                userLocationAcquired = true;
                loadMapData();  //Here the method is called for heavy data retrieval    
            }
        });

このRunnableの途中実行を停止するにはどうすればよいですか?

4

3 に答える 3

2

AsyncTaskを使用できます (おそらく使用する必要があります) 。

private class MapLoader extends AsyncTask<Void, Void, Data> {
    @Override
    protected Data doInBackground(Void... params) {
        return loadMapData();  //Here the method is called for heavy data retrieval, make it return that Data  
    }
    @Override
    protected void onPostExecute(Data result) {
    //do things with your mapview using the loaded Data (this is executed by the uithread)
    }
}

そして、他のコードを

final MapLoader mapLoader = new MapLoader();
myLocationOverlay.runOnFirstFix(new Runnable() {
    public void run() {
        mc.animateTo(myLocationOverlay.getMyLocation());
        mc.setZoom(15);
        userLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
        userLongitude = myLocationOverlay.getMyLocation().getLongitudeE6();
        userLocationAcquired = true;
        mapLoader.execute();
    }
});

次に、実行中のタスクを完了させたくないときに、実行中のタスクをキャンセルできるはずです

mapLoader.cancel(true);

コードがコンパイルされることを願っています。テストはしていませんが、動作するはずです:)

MapLoader を作成するのが UI スレッドであることを確認してください。

編集:新しいスレッドを生成する可能性があるため、正しく機能させるためにmapLoader.execute();は、呼び出しを呼び出しでラップする必要があると思いますrunOnUiThread()runOnFirstFix()

于 2011-07-12T21:41:25.617 に答える
1

ハンドラー オブジェクトを使用して、このランナブルを処理します。

このランナブルをランナブル オブジェクトで定義します。

その後、ハンドラーでこの実行可能なサービスのキャンセルを開始できます

例えば

Handler handler = new Handler();

startCommand() で

handler.postDelayed(myRunnable,5000);

これにより、5 秒後に runnable の run メソッドが実行されます

キャンセルの場合

handler.removeCallbacks(myRunnable);

そして、あなたの実行可能な定義はこのように

private Runnable myRunnable = new Runnable(){
      public void run(){
          // do something here
      }
}

http://developer.android.com/reference/android/os/Handler.html

http://developer.android.com/reference/java/util/logging/Handler.html

http://www.vogella.de/articles/AndroidPerformance/article.html

于 2011-07-12T14:40:06.040 に答える
0

Java では、interrupt()特定のスレッドの実行を停止する実行中のスレッドを呼び出すことができます。wait()ただし、またはのような何らかのブロッキング操作join()が実行されている場合は、InterruptedExceptionスローされます。一部の種類のソケット関連のブロック操作でさえ、InterruptedIOExceptionLinux では、または Windows ではブロックされたままになる可能性があります (Windows は割り込み可能な I/O をサポートしていないため)。ランナブルを中断できると思いますが、一部の I/O は終了するまで中断されない可能性があり、ブロックすると、前述のような例外がスローされる可能性があることに注意してください。

于 2011-07-12T14:43:36.670 に答える