在 Android 中执行定时操作的最佳实践
Best practice for executing timed actions in Android
在我的代码的特定部分需要 运行 定时 space 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
这让我相信它正在降低性能。
有没有更好的方法来安排每个动作的时间?
首先你应该明白,在处理程序的情况下,你将在创建处理程序的同一线程中执行 Runnable。这意味着如果您 运行 在主线程中,您将与任何用户<->UI 交互共享硬件能力,并且无法保证执行开始的确切时间。
回答您来自 body 的问题 - 不,没有因为 2 postDelayed
次调用而导致性能下降,但可能是因为您的操作。所以你的日志消息与其他东西有关。
更新:
从标题回答你的问题:如果你想 运行 延迟行动,那就是 - 这是在 Android 中执行此操作的正常方法,特别是如果你想 运行 main/UI 线程。
我们可以不使用下面的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
}
});
在我的代码的特定部分需要 运行 定时 space 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
这让我相信它正在降低性能。 有没有更好的方法来安排每个动作的时间?
首先你应该明白,在处理程序的情况下,你将在创建处理程序的同一线程中执行 Runnable。这意味着如果您 运行 在主线程中,您将与任何用户<->UI 交互共享硬件能力,并且无法保证执行开始的确切时间。
回答您来自 body 的问题 - 不,没有因为 2 postDelayed
次调用而导致性能下降,但可能是因为您的操作。所以你的日志消息与其他东西有关。
更新: 从标题回答你的问题:如果你想 运行 延迟行动,那就是 - 这是在 Android 中执行此操作的正常方法,特别是如果你想 运行 main/UI 线程。
我们可以不使用下面的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
}
});