暂停计时器而不破坏并重新创建 - Android

时间:2015-05-06 02:13:57

标签: android timer countdowntimer timertask onpause

我有这个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很新。 感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用 ScheduledExecutorService

来实现您的需求

ScheduledExecutorService 计时器类之间的基本区别是:

  • 使用Timer类,无法检查执行的进度。您可以启动和停止执行但不能根据条件检查执行
  • ScheduledExecutorService提供了检查启动和停止调用之间执行方式的方法。如果任务的任何执行遇到异常,则后续执行被禁止

我们如何达到您的要求:

  • doInBackground()执行
  • 之间需要0.1秒的延迟
  • 我们将能够在其他执行开始时暂停执行

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

信用参考:Answer 1Answer 2

我希望这有助于解决你的一些疑虑

答案 1 :(得分:2)

我建议你完全避开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)
    }


}
相关问题