Android 使用未按预期检查的螺纹注释

Android 使用未按预期检查的螺纹注释,android,android-studio,annotations,metadata,Android,Android Studio,Annotations,Metadata,我想通知开发人员,主线程中需要一个方法,因此我编写了以下代码: @MainThread public void showToast(@NonNull String text) { Toast.makeText(this, text, Toast.LENGTH_LONG).show(); } 然后我写道: new Thread(new Runnable() { @Override public void run() {

我想通知开发人员,主线程中需要一个方法,因此我编写了以下代码:

  @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
和其他注释不同


知道为什么吗?

为线程推理提供您自己的注释

lint检查(恰当地命名为“错误线程”)无法推断调用
showtoos
方法的线程,除非您提供将方法标记为
@WorkerThread
等方法之一的注释

获取原始代码并将
@WorkerThread
注释添加到
run
方法:

new Thread(new Runnable() {
    @Override
    @WorkerThread
    public void run() {
        showToast("");
    }
}).start();
并将正确生成如下所示的线头检查警告:

异步任务的特例

AsyncTask
将其方法标记为正确的线程注释():

如果您碰巧使用了
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 "";
    }

在使用线程注释时,我根本看不到任何警告。我们是否必须更改Android studio上的某些设置。@UbaierBhat它在默认情况下应该启用,但您可以检查您的Android studio检查设置是否存在“错误线程”检查
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 "";
    }
@MainThread
@UiThread
@WorkerThread
@BinderThread
@AnyThread