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 で実行しますが、これは次のものではありません。

ここに画像の説明を入力

注釈でラムダに注釈を付けるにはどうすればよい@WorkerThreadですか? いくつかの場所に配置しようとしましたが、IDE を満足させることができないようです。

4

1 に答える 1

3

どうやら、監査ツールはラムダ式とその仕組みについてまったく理解していないようです。Retrolambda を使用しているため、監査はコンパイルされたコードで機能する可能性が高く、そこではラムダ式がアノテーションを持たない合成メソッドに脱糖されています。しかし、その合成メソッドにはLineNumberTableデフォルトで属性があるため、監査ツールによって生成されたエラーは、正しいソース コード行、つまりラムダ式の場所に関連付けることができます。

ラムダ式に対して生成された合成メソッドにアノテーションを強制する方法はありませんが、合成メソッドを完全に取り除くことができます。

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

これで、ランタイム生成RunnableexpensiveBackgroundOperation直接呼び出され (匿名の内部クラスのバリアントに非常に近くなります)、クラスに文句を言うメソッドはありません。実行時に生成されたクラスのrun()メソッドにも注釈はありませんが、監査には表示されません。

于 2016-05-10T10:17:18.817 に答える