[英]Best way to store a run count for a recursive Runnable that is run by a Handler?
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (counter <= 200) {
doThing();
counter++;
handler.postDelayed(this, 50);
}
}
}, 0);
在上面的代码中,我有一个运行Runnable的处理程序。 我的问题是,由于计数器对象位于Runnable内部,因此需要将其声明为final。
处理此递增值的最佳方法是什么?
目前,我只是使用一个计数器对象,但我觉得它应该更容易一些:
class Counter {
int count;
Counter() {
count = 0;
}
public void addOne() {
count++;
}
}
已经有一些类可以代替使用,例如AtomicInteger或类似的类,但是LongAdder稍有不同。
您实例化该类的对象,然后可以简单地调用各种方法来更改该对象的内部值。
这些类还提供了所需的线程安全性。 如果没有这个属性,这是相当不可能的 ,你方会正确计算了!
除了使用postDelayed()
,还可以使用sendMessageDelayed()
。 您可以发送一条Message
,指示您要运行该可运行对象,然后使用arg1
字段存储当前计数。
private static final int WHAT_DO_WORK = 1;
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == WHAT_DO_WORK) {
doWork(msg.arg1);
}
}
};
private void doWork(int counter) {
if (counter <= 200) {
doThing();
int arg1 = count + 1;
Message message = Message.obtain(handler, WHAT_DO_WORK, arg1, 0);
handler.sendMessageDelayed(message, 50);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.