Лучший способ сохранить счетчик выполнения для рекурсивного Runnable, который запускается обработчиком? - PullRequest
0 голосов
/ 11 декабря 2018
final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (counter <= 200) {
                    doThing();
                    counter++;
                    handler.postDelayed(this, 50);
                }
            }
        }, 0);

В приведенном выше коде у меня есть обработчик, запускающий Runnable.Моя проблема заключается в том, что, поскольку объект counter находится внутри Runnable, он должен быть объявлен как final.

Каков наилучший способ обработки этого увеличивающегося значения?

В настоящее время я просто использую объект счетчика, но я чувствую, что это должно быть проще:

class Counter {
        int count;

        Counter() {
            count = 0;
        }

        public void addOne() {
            count++;
        }
    }

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вместо использования 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);
    }
}
0 голосов
/ 11 декабря 2018

Уже есть классы, которые вы можете использовать вместо этого, например AtomicInteger или аналогичные, но немного отличающиеся LongAdder .

Вы создаете экземпляр объекта этого класса, а затем можете просто вызывать различные методы, которые изменят внутреннее значение этого объекта.

Эти классы также обеспечивают требуемую безопасность потоков.Без этого свойства ваш маловероятно , что ваш счетчик будет правильно рассчитывать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...