1. ホーム
  2. android

[解決済み] タイマー・タスクの一時停止と再開の方法

2022-02-07 20:49:04

質問

Androidアプリで、TextViewを異なる色で点滅させるアニメーションがあります。これを実装するために、TimerTask、Timer、Runnableメソッドを使用しました。アニメーションの途中でユーザーがアプリから離れると onPause() でスレッドを停止し、ユーザーがアプリに戻ると onResume() でスレッドを再開させることが必要です。以下は私が実装したコードですが、(onPause()とonResume()の部分が)動作しておらず、その理由がわかりません。同じような事柄に関する他の投稿をいくつか読みましたが、私の状況で何をすべきかを理解する助けにはなりませんでした。TimerTasks は時代遅れで、ExecutorService メソッドを使用する必要があるようですが、この機能をどのように実装すればよいのか、私には不明です。

   ...timerStep5 = new TimerTask() {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                if (b5) {
                    cashButton2SignalText.setBackgroundColor(Color.RED);
                    cashButton2SignalText.setTextColor(Color.WHITE);
                    b5=false;
                } else {
                    cashButton2SignalText.setBackgroundColor(Color.WHITE);
                    cashButton2SignalText.setTextColor(Color.RED);
                    b5=true;
                }
                }
            });
        }
};

timer5.schedule(timerStep5,250,250);

}

public void onPause(){

    super.onPause();

    timerStep5.cancel();

}

public void onResume(){

    super.onResume();

    timerStep5.run();

}

解決方法は?

の後に TimerTask がキャンセルされた場合、再度実行することはできませんので、新しいインスタンスを作成する必要があります。

詳細はこちらをご覧ください。

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor は新しいコードに推奨され、例外やタスクがスケジュールされた時間より長くかかるようなケースを処理します。

しかし、あなたのタスクの場合 TimerTask で十分です。