使用不按预期检查线程注释

我想通知开发人员需要在主线程中的方法,所以我写了下面的代码:

@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和其他我使用的注释

任何想法为什么?

Solutions Collecting From Web of "使用不按预期检查线程注释"

提供您自己的线索推理注释

除非您提供将方法标记为@WorkerThread之一的注释,否则检测(适当地命名为“WrongThread”)无法推断调用showToast方法的线程。

拿起你的原始代码,并将@WorkerThread注释添加到run方法中:

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

并会正确产生皮棉检测警告如下:

皮棉检查警告

AsyncTask特例

AsyncTask的方法用正确的线程注释标记( 链接到源代码 ):

 @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 ""; } 

对于其他asynchronous模式,您将不得不添加您自己的@WorkerThread或其他注释。

不同线程的完整列表如下:

 @MainThread @UiThread @WorkerThread @BinderThread @AnyThread