web-dev-qa-db-ja.com

TimerTask / Timerを一時停止および再開する方法

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();

}
18

TimerTaskをキャンセルすると、再度実行できなくなります。新しいインスタンスを作成する必要があります。

詳細はこちら:

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

新しいコードにはScheduledThreadPoolExecutorをお勧めします。これは、例外や、スケジュールされた間隔よりも長い時間がかかるタスクなどのケースを処理します。

しかし、あなたの仕事には、TimerTaskで十分です。

12
xy uber.com

ここに私がそれをした方法があります。一時停止が発生する場所(ボタンリスナーなど)にpauseTimerブール値を追加し、trueの場合はタイマーをカウントしません。

private void timer (){
    Timer timer = new Timer();
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer);
    countTimer = 0;
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String s_time = String.format("%02d:%02d:%02d",
                            countTimer / 3600,
                            (countTimer % 3600) / 60,
                            countTimer % 60);
                    tv_timer.setText(s_time);
                    if (!pauseTimer) countTimer++;
                }
            });
        }
    }, 1000, 1000);
}
2
Timer timer1;
private boolean timerStartFlag = false;
private boolean hiddenVisibleFrg = false;
int timerSize = 0;
int videoTime = 0;


@Override
public void onPause() {
    super.onPause();

    Log.e("keshav", "onPause timer1 " +timer1);
    if (timerSize >0 &&hiddenVisibleFrg){
        timerStartFlag =true;
    }

    if (timer1 != null) {
        this.timer1.cancel();
    }

}

@Override
public void onResume() {
    super.onResume();

    if (timerSize >0 && timerStartFlag && hiddenVisibleFrg) {
        callTimerTask(timerSize);
        timerStartFlag = false;
    }
}

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);

    if (!hidden) {
        Log.e("keshav", "HomeFragment  visible ");

        if (timerSize >0 && timerStartFlag) {
            callTimerTask(timerSize);
            timerStartFlag=false;
        }

        hiddenVisibleFrg=true;

    } else {
        Log.e("keshav", "HomeFragment in visible " +timer1);
        if (timer1 != null) {
            this.timer1.cancel();
        }
        if (timerSize >0){
            timerStartFlag =true;
        }
        hiddenVisibleFrg=false;
    }
}


private void callTimerTask(int size) {
    // TODO Timer for auto sliding
    printLog("callTimerTask size " + size);
    timer1 = new Timer();
    timer1.schedule(new TimerTask() {
        @Override
        public void run() {
            if (getActivity() != null) {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (getActivity() == null) {
                            return;
                        }
                        if (count1 < size - 1) {
                            //TODO ADD ME kk
                            count1++;
                        } else {
                            count1 = 0;
                        }
                        if (intro_images != null) {
                            intro_images.setCurrentItem(count1);
                        }
                        videoTime++;
                        Log.e("KeshavTimer", "callTimerTask videoTime " + videoTime);
                    }
                });
            } else {
                printLog("callTimerTask getActivity is null ");
            }
        }
    }, 1000, 1000);
    // TODO  1000, 3000;
}
0
Keshav Gera