1

在我的代码的特定部分需要在一个定时空间中运行 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

这让我相信它正在降低性能。有没有更好的方法来计时行动?

4

2 回答 2

0

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

从身体回答你的问题 - 不,不会因为 2 个postDelayed电话而降低性能,但可能是因为你的行为。因此,您的日志消息与其他内容有关。

更新: 从标题中回答您的问题:如果您想运行延迟操作,那就是 - 这是在 Android 中执行此操作的正常方式,特别是如果您想在主/UI 线程中运行它。

于 2015-03-22T08:09:42.077 回答
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
    }
});
于 2015-03-22T09:17:36.433 回答