我正在更新一些代码以在Android上使用retrolambda。代码大部分都有效,但Android Studio 2.1 IDE似乎标记了之前的OK代码:
@WorkerThread void expensiveBackgroundOperation()
{
// Stuff.
}
@UiThread void updateSomeStuffOld()
{
AsyncTask.execute(new Runnable() {
@Override public void run()
{
expensiveBackgroundOperation();
}
});
}
@UiThread void updateSomeStuffNew()
{
AsyncTask.execute(() -> expensiveBackgroundOperation());
}
以下屏幕截图显示正确推断旧的runnable语法(或者更确切地说,它不是推断的,并且需要使用@WorkerThread注释run()
方法以使注释正常工作...)但是在retrolambda语法版本推断该方法在UI上运行,而不是:
如何使用@WorkerThread
注释对lambda进行注释?我已经尝试将它放在几个地方,但我似乎无法让IDE开心。
答案 0 :(得分:3)
显然,审计工具不知道lambda表达式及其工作原理。由于您使用的是Retrolambda,因此审计很可能适用于已编译的代码,其中lambda表达式已经被合法化,但没有任何注释。但由于该合成方法默认具有LineNumberTable
属性,因此审计工具生成的错误可以与正确的源代码行相关联,即lambda表达式的位置。
无法对为lambda表达式生成的合成方法强制执行注释,但您可以完全摆脱合成方法:
@UiThread void updateSomeStuffNew()
{
AsyncTask.execute(this::expensiveBackgroundOperation);
}
现在,运行时生成的Runnable
将直接调用expensiveBackgroundOperation
(更接近您的匿名内部类变体)并且您的类中没有任何方法可以抱怨。运行时生成的类的run()
方法也没有任何注释,但审计不可见。