15

アプリケーションに、15 秒ごとに AsyncTask を起動するタイマーがあります。

Timer timer = new Timer();

public void AsynchTaskTimer() {
    final Handler handler = new Handler();

    TimerTask timertask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        new updateGPSTask().execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(timertask, 0, 15000); // execute in every 15sec
}

これはonCreate()メソッドから起動されます。

別のアクティビティを呼び出すときは、メイン アクティビティのメソッドで使用timer.cancel()したこのタイマーをキャンセルする必要があります。onPause()

メイン アクティビティに戻ったら、タイマーを再起動する必要があります。メソッドで をAsynchTaskTimer()再起動しようとしましたが、 .onRestart()java.lang.IllegalStateException: Timer was canceled

タイマーを再起動するにはどうすればよいですか?

4

3 に答える 3

25

使ってみてください:

public void AsynchTaskTimer() {
    final Handler handler = new Handler();

    TimerTask timertask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        new updateGPSTask().execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer = new Timer(); //This is new
    timer.schedule(timertask, 0, 15000); // execute in every 15sec
    }

これを使用すると、メモリをタイマーに再度割り当てて、AFAIKを開始できます。

于 2013-03-28T11:34:08.953 に答える
17

したがって、 cancel()メソッドに関するドキュメントは次のように述べています。

繰り返しタイマー タスクの run メソッド内からこのメソッドを呼び出すと、タイマー タスクが再度実行されないことが確実に保証されることに注意してください。

これは、一度 cancel() Timer を実行すると、再度実行できないことを意味します。onResume()もう一度実行したい場合は、メソッドなどで Timer の新しいインスタンスを作成する必要があります。

@Override
public void onResume() {
   super.onResume();
   // intialise new instance of Timer
}
于 2013-03-28T11:34:16.077 に答える
1

を使用する代わりにTimerTask、コード (GPS の更新に使用される) をサービスに移動できます。私はそれが良いと思います。とstartService()で通話できます。サービスはメインの UI スレッドで実行されることに注意してください。そのため、GPS アップデーター タスクでは を避けるようにしてください。onCreate()stopService()onDestroy()NetworkOnMainThreadException

于 2013-03-28T11:43:23.663 に答える