如何使用@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 也不会有任何注释,但审计不可见。
我正在更新一些代码以在 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 也不会有任何注释,但审计不可见。