我想通知开发人员一个方法需要在主线程中,所以我写了以下代码:
@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
和我使用的其他注释不同。
任何想法为什么?
答案 0 :(得分:7)
为线程推断提供您自己的注释
lint检查(恰当地命名为" WrongThread")无法推断调用showToast
方法的线程,除非您提供将方法标记为@WorkerThread
之一的注释等。
获取原始代码并将@WorkerThread
注释添加到run
方法中:
new Thread(new Runnable() {
@Override
@WorkerThread
public void run() {
showToast("");
}
}).start();
它将正确生成lint检查警告,如下所示:
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