在Android中执行定时操作的最佳实践

时间:2015-03-22 07:51:10

标签: android handler android-handler android-runtime

在我需要在定时空间中运行3个操作的代码的特定部分中,现在我正在使用此方法:

Handler mHander = new Handler();


public void startChainActions(){

// do first action
      mHandler.postDelayed(new Runnable() {
          @Override
          public void run() {

          //do action 2

                    mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                    //do action 3
                    }
                  }
                }, 1500);

              }
             }
            }, 5000);
           }


public void cleanResources(){

    mHandler.removeCallbacksAndMessages(null);
    mHandler==null
}

使用此方法时,我经常在logcat上看到此消息:

W/art﹕ Suspending all threads took: 12.272ms

这让我相信它会降低性能。 是否有更好的方法来相互计划时间?

2 个答案:

答案 0 :(得分:0)

首先,你应该明白,在Handlers的情况下,你将在创建处理程序的同一个线程中执行Runnable。这意味着如果您在主线程中运行它,您将与任何用户< - > UI交互共享硬件能力,并且无法保证准确的执行开始时间。

从正文回答你的问题 - 不,由于2次postDelayed电话,性能没有减慢,但可能是因为你的行为。因此,您的日志消息与其他内容相关联。

<强>更新 从标题回答你的问题:如果你想运行延迟动作,而不是 - 这是在Android中执行此操作的正常方式,特别是如果你要在主/ UI线程中运行它。

答案 1 :(得分:0)

我们不能使用SingleThreadExecutor,如下所示。

ExecutorService animationQueue = Executors.newSingleThreadExecutor();

animationQueue.submit( new Runnable() {
    public void run() {
        // action 1
        Thread.sleep(5000);
    }
});

animationQueue.submit( new Runnable() {
    public void run() {
        // action 2
        Thread.sleep(1500);
    }
});

animationQueue.submit( new Runnable() {
    public void run() {
        // action 3
    }
});