猿问

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

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++;

        }

    }


青春有我
浏览 132回答 2
2回答

明月笑刀无情

已经有您可以使用的类,例如AtomicInteger或类似但略有不同的 LongAdder。您实例化该类的一个对象,然后您可以简单地调用将更改该对象的内部值的各种方法。这些类还提供了所需的线程安全。如果没有该属性,您的计数器就不太可能正确计数!

德玛西亚99

而不是使用postDelayed(),你可以使用sendMessageDelayed()。您可以发送一个Message指示您要运行该可运行文件的信息,然后使用该arg1字段来存储当前计数。private static final int WHAT_DO_WORK = 1;final Handler handler = new Handler() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void handleMessage(Message msg) {&nbsp; &nbsp; &nbsp; &nbsp; if (msg.what == WHAT_DO_WORK) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doWork(msg.arg1);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }};private void doWork(int counter) {&nbsp; &nbsp; if (counter <= 200) {&nbsp; &nbsp; &nbsp; &nbsp; doThing();&nbsp; &nbsp; &nbsp; &nbsp; int arg1 = count + 1;&nbsp; &nbsp; &nbsp; &nbsp; Message message = Message.obtain(handler, WHAT_DO_WORK, arg1, 0);&nbsp; &nbsp; &nbsp; &nbsp; handler.sendMessageDelayed(message, 50);&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Java
我要回答