如何使用@WorkerThread注释lambda?

时间:2016-04-28 08:37:20

标签: java android android-studio lambda retrolambda

我正在更新一些代码以在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上运行,而不是:

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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