Java Android:使用Lambda间隔执行runnable
Android中每X毫秒执行一次代码的方式如下:Java Android:使用Lambda间隔执行runnable,java,android,lambda,Java,Android,Lambda,Android中每X毫秒执行一次代码的方式如下: void测试(处理程序){ handler.post(新的Runnable(){ @凌驾 公开募捐{ //做点什么 //每200米做一次 handler.postDelayed(这个,200); } }); } 但是,我已经开始更改代码,尽可能使用lambdas。将此模式更改为lambda有一个问题:lambda中的此引用外部类,因此不能在postDelayed(…)中使用 为了让它工作,我必须保留对lambda的引用。但是,该引用不能位于局部
void测试(处理程序){
handler.post(新的Runnable(){
@凌驾
公开募捐{
//做点什么
//每200米做一次
handler.postDelayed(这个,200);
}
});
}
但是,我已经开始更改代码,尽可能使用lambdas。将此模式更改为lambda有一个问题:lambda中的此
引用外部类,因此不能在postDelayed(…)
中使用
为了让它工作,我必须保留对lambda的引用。但是,该引用不能位于局部变量中。这意味着为该lambda runnable查找一个有意义的名称,并将其存储为类成员:
private Runnable intervalRunnable;
...
void testWithLambda(){
this.intervalRunnable=()->{
//做点什么
//每200米做一次
handler.postDelayed(intervalRunnable,200);
};
handler.post(可中断运行);
}
因此,代码更“现代”,但可以说更难看,更不易维护
还有别的办法解决这个问题吗?我喜欢lambdas,但我不想把这些引用保留在类级别。在这些选项中,我更喜欢使用匿名类模式。说明:
15.27.2。Lambda车身。。。
实际上,lambda表达式需要谈论自身(或者称为自身)是不常见的
递归或调用其其他方法)…如果
lambda表达式引用自身(好像通过它),一个方法
应改用引用或匿名内部类
我读到的基本意思是“如果需要递归lambda,不要使用lambda。”
基于这一点,我们似乎不得不遵循第二个示例的思路,在该示例中,您保存了对类的lambda引用(尽管可以说这或多或少等同于使用方法引用)
您可以尝试隐藏正在使用方法引用的事实:
Handler handler = new Handler();
Runnable everyXMillis(Runnable inner, int ms) {
return () -> {
inner.run();
handler.postDelayed(everyXMillis(inner, ms), ms);
};
}
void testWithMethodReference() {
handler.post(everyXMillis(() -> {
// do something
}, 200));
}
…但是…恶心!如果您担心代码丑陋且无法维护,那么最好使用更详细的匿名Runnable。因此,除非我读错了,否则在您的“恶心”建议中,您现在用另一个来包装实际的Runnable。。。我曾想过这样的事情,但它让我觉得更加丑陋。我想现在我会继续上好的匿名课程。我想确保我没有遗漏任何东西。