热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用未按预期检查的线程注释

如何解决《使用未按预期检查的线程注释》经验,为你挑选了1个好方法。

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

  @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


推荐阅读
author-avatar
tuigq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有