Jes*_*rix 9 android annotations metadata android-studio
我想通知开发人员一个方法需要在主线程中,所以我写了以下代码:
@MainThread
public void showToast(@NonNull String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
比我写的:
new Thread(new Runnable() {
@Override
public void run() {
showToast("");
}
}).start();
Run Code Online (Sandbox Code Playgroud)
并且编译器没有将此标记为错误,与@StringRes我使用的其他注释不同.
任何想法为什么?
为线程推断提供您自己的注释
lint检查(恰当地命名为"WrongThread")无法推断调用该showToast方法的线程,除非您提供将方法标记为@WorkerThread等等的注释.
获取原始代码并将@WorkerThread注释添加到run方法中:
new Thread(new Runnable() {
@Override
@WorkerThread
public void run() {
showToast("");
}
}).start();
Run Code Online (Sandbox Code Playgroud)
它将正确生成lint检查警告,如下所示:
特例 AsyncTask
AsyncTask将其方法标记为正确的线程注释(链接到源):
@WorkerThread
protected abstract Result doInBackground(Params... params);
Run Code Online (Sandbox Code Playgroud)
如果您碰巧使用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 "";
}
Run Code Online (Sandbox Code Playgroud)
对于其他异步模式,您必须添加自己的@WorkerThread或其他注释.
不同的线程的完整列表是在这里:
@MainThread
@UiThread
@WorkerThread
@BinderThread
@AnyThread
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |