2017-06-19 90 views
9

我想通知需要一種方法是在主線程開發人員使用線程註解,所以我寫信給下面的代碼:沒有被檢查預期

@MainThread 
    public void showToast(@NonNull String text) { 
     Toast.makeText(this, text, Toast.LENGTH_LONG).show(); 
    } 

比我寫道:

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      showToast(""); 
     } 
    }).start(); 

和編譯器不會將此標記爲錯誤,不像@StringRes和我使用的其他註釋。

有什麼想法爲什麼?

回答

7

供應自己的註釋線程推斷

皮棉檢驗(恰當地命名爲「WrongThread」)不能推斷,除非您提供的標記方法的@WorkerThread等一個註解被調用showToast方法的線程。

把你的原始代碼和註釋@WorkerThread添加到run方法:

new Thread(new Runnable() { 
    @Override 
    @WorkerThread 
    public void run() { 
     showToast(""); 
    } 
}).start(); 

,就會正確生成如下皮棉檢驗警告:

lint inspection warning

特殊情況下AsyncTask

AsyncTask已經打上了正確的線程註釋(link to source)的方法:

@WorkerThread 
protected abstract Result doInBackground(Params... params); 

如果您發生,您將免費獲得警告使用一個AsyncTask像下面的例子:

new AsyncTask<String, String, String>() { 
    @Override 
    protected String doInBackground(String... strings) { 
     showToast(""); //warning here: method showToast must be called from the main thread 
         //currently inferred thread is worker 
     return ""; 
    } 

對於其他異步模式,你將不得不添加自己的@WorkerThread或其他註釋。

不同線程的完整列表是here

@MainThread 
@UiThread 
@WorkerThread 
@BinderThread 
@AnyThread