gpt4 book ai didi

java - 如何使用 @WorkerThread 注释 lambda?

转载 作者:行者123 更新时间:2023-12-01 21:36:25 25 4
gpt4 key购买 nike

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

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

enter image description here

如何使用 @WorkerThread 注释来注释 lambda?我已尝试将其放置在多个位置,但似乎无法让 IDE 满意。

最佳答案

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

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

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

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

关于java - 如何使用 @WorkerThread 注释 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com