0

我正在更新一些代码以在 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());
}

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

在此处输入图像描述

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

4

1 回答 1

3

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

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

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

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

于 2016-05-10T10:17:18.817 回答