暂停计时器而不破坏并重新创建 – Android
作者:互联网
我有这个AsyncTask,每次执行“doInBackground”时休眠0.1秒,之前我使用CountDownTimer控制我的时间.
我的问题是:我想实现一个可以暂停而不调用.cancel()的计时器,并在开始创建另一个计时器时.
有没有办法实现这个是android?我没有找到如何以不同的方式做到这一点.你能举例吗?
我在哪里找到取消计时器的示例:
> How to stop the Timer in android?
> Android timer? How-to?
> http://www.androidhub4you.com/2013/04/countdown-demo-in-android-custom-timer.html
编辑
回答Kevin Krumwiede:这个项目是一种游戏,我必须在一个确定的时间内击中阻止,所以当玩家使用某种特殊的力量时(按下指定的按钮)我想要达到一种停止计时器的方法.
EDIT2
回答Kushal:我不知道你是否编译了这段代码,但是我不能使用task1变量.这里是代码:
public void doIt(){
final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
final Runnable task =
new Runnable() {
@Override
public void run() {
timerAsyncTask.execute();
if(true) {
exec.shutdown(); // shutdown this execution
//exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS);
}
}
};
exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS);
}
这里exec = Executors.newSingleThreadScheduledExecutor();它显示了一个错误:
Error:(33, 21) error: cannot assign a value to final variable exec
一旦exec是最终变量,我认为这很好.
这里是exec.scheduleAtFixedRate(task,0,100,TimeUnit.MILLISECONDS);我有另一个错误:
Error:(34, 46) error: variable task might not have been initialized
你能解释一下,我怎么能用这段代码?我对android很新.
谢谢.
解决方法:
我建议你完全避开Android中的计时器. Android具有轻量级和更好的解决方案,称为Handler
你可以找到这两个here之间的比较.总结一下
比较处理程序VS计时器
>虽然重新安排Handler非常简单,但您无法重新安排Timer
>在Handler中,您只能附加到任何Runnable但定时器计划
一个TimerTask
> TimerTask纯粹是后台任务,因此您无法更新
UserInterface,但对于Handler的Runnables来说并非如此
>计时器导致执行
>与Handler相比,计时器倾向于泄漏更多内存,请参见图表
对象由计时器和处理程序保留.它会迅速增加
定时器,如果您正在创建和安排新任务.
如帖子所示,Handler的使用非常简单.这是一个示例代码
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
public class TestActivity extends AppCompatActivity {
private static int INITIAL_TIMER_DELAY = 100;
private static int TIMER_PERIOD = 100;
private android.os.Handler handler;
private Runnable runnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler(Looper.getMainLooper());
runnable = new Runnable() {
@Override
public void run() {
// Do something and reschedule ourself
handler.postDelayed(this, TIMER_PERIOD);
}
};
handler.postDelayed(runnable, INITIAL_TIMER_DELAY);
}
@Override
protected void onDestroy() {
super.onDestroy();
cancelTimer();
}
private void cancelTimer() {
if (handler != null) {
handler.removeCallbacks(runnable);
}
}
private void rescheduleRunnable() {
handler.postDelayed(runnable, INITIAL_TIMER_DELAY)
}
}
标签:android,timer,timertask,countdowntimer,onpause 来源: https://codeday.me/bug/20190623/1274388.html