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