22

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

}
4

4 回答 4

14

aTimerTask被取消后就不能再运行了,必须创建一个新的实例。

在此处阅读详细信息:

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

ScheduledThreadPoolExecutor推荐用于较新的代码,它可以处理异常和任务花费比计划间隔更长的时间等情况。

但是对于你的任务来说,TimerTask应该足够了。

于 2013-03-15T23:05:15.100 回答
4

这就是我的做法。在暂停发生的地方添加pauseTimer布尔值(也许是按钮侦听器),如果为真,则不计算计时器。

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);
}
于 2016-08-20T00:06:42.193 回答
1

对于 Kotlin 用户,请查看

如何使用:

// Init timer
lateinit var timerExt: CountDownTimerExt

timerExt = object : CountDownTimerExt(TIMER_DURATION, TIMER_INTERVAL) {
    override fun onTimerTick(millisUntilFinished: Long) {
        Log.d("MainActivity", "onTimerTick $millisUntilFinished")
    }

    override fun onTimerFinish() {
        Log.d("MainActivity", "onTimerFinish")
    }

}

// Start/Resume timer
timerExt.start()

// Pause timer
timerExt.pause()

// Restart timer
timerExt.restart()
于 2020-11-02T07:23:23.347 回答
0
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;
}
于 2019-08-08T10:33:23.520 回答