为了账号安全,请及时绑定邮箱和手机立即绑定

存储由 Handler 运行的递归 Runnable 的运行计数的最佳方法?

存储由 Handler 运行的递归 Runnable 的运行计数的最佳方法?

青春有我 2022-03-10 16:13:14
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 内,因此需要将其声明为最终对象。处理这个递增值的最佳方法是什么?目前我只是使用一个计数器对象,但我觉得它应该更容易:class Counter {        int count;        Counter() {            count = 0;        }        public void addOne() {            count++;        }    }
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

已经有您可以使用的类,例如AtomicInteger或类似但略有不同的 LongAdder

您实例化该类的一个对象,然后您可以简单地调用将更改该对象的内部值的各种方法。

这些类还提供了所需的线程安全。如果没有该属性,您的计数器就不太可能正确计数!


查看完整回答
反对 回复 2022-03-10
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

而不是使用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);

    }

}


查看完整回答
反对 回复 2022-03-10
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信