Способ выполнения кода каждые X миллис в Android заключается в следующем шаблоне:
void test(Handler handler) {
handler.post(new Runnable() {
@Override
public void run() {
// Do something
// Do it every 200ms
handler.postDelayed(this, 200);
}
});
}
Однако я начал изменять код для использования лямбда-выражений, когда это возможно.Изменение этого шаблона на лямбда имеет одну проблему: this
внутри лямбды ссылается на внешний класс, поэтому его нельзя использовать в postDelayed(...)
.
Чтобы заставить его работать, я должен сохранить ссылку налямбдаОднако эта ссылка не может быть в локальной переменной.Это означает поиск значимого имени для этого лямбда-запускаемого и сохранение его как члена класса:
private Runnable intervalRunnable;
...
void testWithLambda() {
this.intervalRunnable = () -> {
// Do something
// Do it every 200ms
handler.postDelayed(intervalRunnable, 200);
};
handler.post(intervalRunnable);
}
Таким образом, код более «современный», но, возможно, более уродливый и менее обслуживаемый.
Есть ли другой способ решить эту проблему?Я люблю лямбды, но я бы предпочел не хранить эти ссылки на уровне класса.Между этими опциями я предпочитаю придерживаться анонимного шаблона класса.