2016-04-28 16 views
0

Androidでretrolambdaを使用するためのコードをいくつか更新しています。コードは、主に動作しますが、Androidのメーカー2.1 IDEは、フラグに以前OKコードようだ:@WorkerThreadでラムダに注釈を付けるにはどうすればよいですか?

@WorkerThread void expensiveBackgroundOperation() 
{ 
    // Stuff. 
} 

@UiThread void updateSomeStuffOld() 
{ 
    AsyncTask.execute(new Runnable() { 
     @Override public void run() 
     { 
      expensiveBackgroundOperation(); 
     } 
    }); 
} 

@UiThread void updateSomeStuffNew() 
{ 
    AsyncTask.execute(() -> expensiveBackgroundOperation()); 
} 

次のスクリーンショットは、古い実行可能な構文が正しく推論される(というか、それが推論されないことを示しているとrun()方法...注釈が適切に内部動作するため@WorkerThreadでアノテートされる必要があるであろう)が、方法がないUI上で実行するように推察されるretrolambda構文バージョンで:

enter image description here

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

答えて

3

明らかに、監査ツールにはラムダ式とその動作方法がありません。 Retrolambdaを使用しているので、おそらく監査はコンパイルされたコードで動作します。コンパイルされたコードでは、ラムダ式は合成メソッドに置き換えられており、注釈はありません。しかし、その合成方法はデフォルトでLineNumberTable属性を有するので、監査ツールによって生成されたエラーは、正しいソースコード行、すなわちラムダ式の位置に関連付けることができる。

は、ラムダ式のために生成された合成方法に注釈を強制する方法はありませんが、あなたは全くの合成方法を取り除くことができます。

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

さて、実行時に生成さRunnableが起動しますexpensiveBackgroundOperation(あなたの匿名の内部クラスのバリアントにはるかに近い)、あなたのクラスに不平を言うメソッドはありません。ランタイム生成クラスのrun()メソッドには注釈も含まれませんが、監査では表示されません。

関連する問題