作者:tuigq | 来源:互联网 | 2023-01-31 19:38
我想通知开发人员一个方法需要在主线程中,所以我写了以下代码:
@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
我使用的其他注释不同.
任何想法为什么?
1> David Rawson..:
为线程推断提供您自己的注释
lint检查(恰当地命名为"WrongThread")无法推断调用该showToast
方法的线程,除非您提供将方法标记为@WorkerThread
等等的注释.
获取原始代码并将@WorkerThread
注释添加到run
方法中:
new Thread(new Runnable() {
@Override
@WorkerThread
public void run() {
showToast("");
}
}).start();
它将正确生成lint检查警告,如下所示:
特例 AsyncTask
AsyncTask
将其方法标记为正确的线程注释(链接到源):
@WorkerThread
protected abstract Result doInBackground(Params... params);
如果您碰巧使用AsyncTask
以下示例中的类似内容,您将免费获得警告:
new AsyncTask() {
@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
或其他注释.
不同的线程的完整列表是在这里:
@MainThread
@UiThread
@WorkerThread
@BinderThread
@AnyThread