【问题标题】:Handler and Runnable being slowHandler 和 Runnable 很慢
【发布时间】:2016-06-01 15:17:59
【问题描述】:

我已经解决了我的问题,但我认为我的解决方案不是最好的。

我想要一个计时器,在有限的时间内每秒更改一个文本。我使用 Handler 和 Runnable 这样做:

private Handler handler;
private Runnable runnable = new Runnable(){
    private Date timeSinceLastTask;
    @Override
    public void run() {
        remainingTime--;
        if(timeSinceLastTask != null){
            Date timeWokeUp = new Date();
            long hoursSinceSleep = timeWokeUp.getTime() - timeSinceLastTask.getTime();
            if(hoursSinceSleep > 2000){
                Log.e("Error", (int)(hoursSinceSleep/1000) + "sec");
                remainingTime - (int)(hoursSinceSleep/1000));
            }
        }
        Log.e("Tick", "Tack " + remainingTime);
        if(remainingTime > 0){
            updateText();
            timeSinceLastTask = new Date();
            handler.postDelayed(runnable, 1000);
        }else{
            handler.removeCallbacks(runnable);
        }
    }
};

我必须添加带有日期的部分来计算最后一个任务的执行时间,因为有时,当设备进入睡眠状态时,我可能需要 50 秒才能执行下一个任务,因此会减慢倒计时。一秒不能超过一秒!

通过我的修复,这很好,但我想知道任务有时在睡眠中执行缓慢的原因是什么。

谢谢!

【问题讨论】:

  • 我能否说明不赞成票的原因或解释为什么我的问题值得一票?
  • 你为什么不用定时器来代替?
  • 那有什么好处?
  • 它在什么 API 级别上运行?是 6 岁以上吗?
  • 是的,API 15 及更高版本

标签: android task handler runnable


【解决方案1】:

当您使用Handler 时,它会绑定到您创建它的线程。这意味着,当您在主线程(UI 线程)中创建此 Handler 时,它执行的可运行对象必须与其他 UI 任务一起运行。它可能会也可能不会影响主线程的性能。这取决于您在可运行文件中运行的任务,以及 UI 的性能。

另一方面,如果您改用Timer,则您将在单独的线程上执行此任务。它不会以任何方式影响主线程。另外,Timer 可以安排在执行前延迟和每次执行的时间段。可以取消,可以停止,可以继续。管理和控制 TimerHandler 灵活得多。

【讨论】:

  • 这是一个很好的答案,谢谢!我会尽快查看并及时通知您,谢谢!
猜你喜欢
  • 2013-09-11
  • 2014-02-07
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2018-09-03
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多