Java 如何用@WorkerThread注释lambda?

Java 如何用@WorkerThread注释lambda?,java,android,android-studio,lambda,retrolambda,Java,Android,Android Studio,Lambda,Retrolambda,我正在更新一些在Android上使用的代码。代码基本上是有效的,但Android Studio 2.1 IDE似乎标记了以前的OK代码: @WorkerThread void expensiveBackgroundOperation() { // Stuff. } @UiThread void updateSomeStuffOld() { AsyncTask.execute(new Runnable() { @Override public void run()

我正在更新一些在Android上使用的代码。代码基本上是有效的,但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());
}
下面的屏幕截图显示,旧的可运行语法被正确推断(或者说,它没有被推断,并且
run()
方法需要使用@WorkerThread进行注释才能在内部正常工作…),但是在retrolambda语法版本中,该方法被推断为在UI上运行,这不是:


如何使用
@WorkerThread
注释来注释lambda?我试着把它放在几个地方,但我似乎不能让IDE满意。

显然,审计工具不知道lambda表达式及其工作方式。由于您使用的是Retrolambda,审计很可能对编译后的代码起作用,其中lambda表达式已被分解为一个合成方法,该方法没有任何注释。但是,由于该合成方法默认具有
LineNumberTable
属性,因此审计工具生成的错误可以与正确的源代码行关联,即lambda表达式的位置

无法在为lambda表达式生成的合成方法上强制执行注释,但您完全可以放弃合成方法:

@UiThread void updateSomeStuffNew()
{
    AsyncTask.execute(this::expensiveBackgroundOperation);
}

现在,运行时生成的
Runnable
将直接调用
expensiveBackgroundOperation
(更接近匿名内部类变量),并且类中没有可抱怨的方法。运行时生成的类的
run()
方法也不会有任何注释,但审计人员看不到这些注释。

显然,审计工具不知道lambda表达式及其工作方式。由于您使用的是Retrolambda,审计很可能对编译后的代码起作用,其中lambda表达式已被分解为一个合成方法,该方法没有任何注释。但是,由于该合成方法默认具有
LineNumberTable
属性,因此审计工具生成的错误可以与正确的源代码行关联,即lambda表达式的位置

无法在为lambda表达式生成的合成方法上强制执行注释,但您完全可以放弃合成方法:

@UiThread void updateSomeStuffNew()
{
    AsyncTask.execute(this::expensiveBackgroundOperation);
}
现在,运行时生成的
Runnable
将直接调用
expensiveBackgroundOperation
(更接近匿名内部类变量),并且类中没有可抱怨的方法。运行时生成的类的
run()
方法也不会有任何注释,但审计人员看不到这些注释