我有这个AsyncTask,每次执行" doInBackground"时会休息0.1秒,在此之前我使用CountDownTimer控制我的时间。
我的问题是:我想实现一个可以在不调用.cancel()
的情况下暂停的计时器,以及何时开始创建另一个计时器。
有没有办法实现这个是android?我没有找到如何以不同的方式做到这一点。你能举例吗?
我发现取消计时器的例子:
修改
回答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();
显示错误:
错误:(33,21)错误:无法为最终变量exec
赋值
一旦exec是最终变量,我认为这很好。
而exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS);
我又收到了另一个错误:
错误:(34,46)错误:变量任务可能尚未初始化
你能解释一下,我该如何使用这段代码?我对android很新。 感谢。
答案 0 :(得分:2)
您可以使用 ScheduledExecutorService 类
来实现您的需求ScheduledExecutorService 和计时器类之间的基本区别是:
ScheduledExecutorService
提供了检查启动和停止调用之间执行方式的方法。如果任务的任何执行遇到异常,则后续执行被禁止我们如何达到您的要求:
doInBackground()
执行我们将能够在其他执行开始时暂停执行
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
Runnable task1 = new Runnable() {
public void run() {
// start your AsyncTask here
new <your_task>().execute();
if (<check_your_condition_when_to_pause>) {
exec.shutdown(); // shutdown this execution
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(task1, 0, 100, TimeUnit.MILLISECONDS);
// here i have passed task1 for example
// here we need to pass next task runnable which
// we want to run after 0.1 seconds
} else {
// continue normal
}
}
};
exec.scheduleAtFixedRate(task1, 0, 100, TimeUnit.MILLISECONDS);
我希望这有助于解决你的一些疑虑
答案 1 :(得分:2)
我建议你完全避开Android中的计时器。 Android具有轻量级和更好的解决方案,称为Handler
您可以找到这两个here之间的比较。总结一下
比较处理程序VS计时器
如帖子所示,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)
}
}