如何使用@WorkerThread 注释 lambda?

How can I annotate a lambda with @WorkerThread?

我正在更新一些代码以在 Android 上使用 retrolambda。该代码大部分都有效,但 Android Studio 2.1 IDE 似乎标记了之前正常的代码:

@WorkerThread void expensiveBackgroundOperation()
{
    // Stuff.
}

@UiThread void updateSomeStuffOld()
{
    AsyncTask.execute(new Runnable() {
        @Override public void run()
        {
            expensiveBackgroundOperation();
        }
    });
}

@UiThread void updateSomeStuffNew()
{
    AsyncTask.execute(() -> expensiveBackgroundOperation());
}

下面的截图显示旧的 运行nable 语法被正确推断(或者更确切地说,它没有被推断并且 run() 方法需要用 @WorkerThread 注释才能工作内部正确...)但在 retrolambda 语法版本中,该方法被推断为 UI 上的 运行,这不是:

如何使用 @WorkerThread 注释对 lambda 进行注释?我试过将它放在几个地方,但似乎无法让 IDE 满意。

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

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

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

现在,运行时生成的 Runnable 将直接调用 expensiveBackgroundOperation(更接近于您的匿名内部 class 变体)并且您的 class 中没有方法来抱怨。运行时生成的 run() 方法 class 也不会有任何注释,但审计不可见。