Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:使用Lambda间隔执行runnable_Java_Android_Lambda - Fatal编程技术网

Java Android:使用Lambda间隔执行runnable

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的引用。但是,该引用不能位于局部

Android中每X毫秒执行一次代码的方式如下:

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。。。我曾想过这样的事情,但它让我觉得更加丑陋。我想现在我会继续上好的匿名课程。我想确保我没有遗漏任何东西。