美文网首页
Android Handler使用

Android Handler使用

作者: CodeDuan | 来源:发表于2021-03-10 17:39 被阅读0次

    在日常开发中,都避免不了进行网络请求,并更新View,由于Android中主线程不可以进行耗时操作,所以我们的网络请求只能放在子线程中,又由于在子线程中不能更新UI,所以我们就需要使用Handler切换到主线程并更新UI。

    在介绍Handler使用之前,我们先了解以下两个问题。

    1、为什么主线程不能进行耗时操作?
    因为如果在主线程进行耗时操作,容易出现ANR,Application Not Responding,即应用无响应,当在一定的时间内,app无法响应时就会出现ANR,并弹出一个 对话框提示应用无响应,所以我们应该避免在主线程中进行耗时操作,当我们应用出现ANR时,会在
    /data/anr/目录中生成traces.txt,我们可以通过这个文件查找错误信息。

    2、为什么子线程中不能更新UI?
    这是因为在子线程中更新UI不是线程安全的,在Android源码ViewRootImpl的checkThread方法中也对UI做了验证。

    void checkThread() {
            if (mThread != Thread.currentThread()) {
                throw new CalledFromWrongThreadException(
                        "Only the original thread that created a view hierarchy can touch its views.");
            }
        }
    

    基于这两个问题,我们可以使用Handler来解决,接下来介绍Handler的基本使用。

    首先创建Handler

    Handler handler = new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(@NonNull Message msg) {
                    return false;
                }
            });
    

    接下来发送消息。

            //创建Message
            Message msg = Message.obtain();
            msg.what = 0;
            //创建Bundle
            Bundle bundle = new Bundle();
            bundle.putString("key","我是一笑消息");
            //为Message设置Bundle数据
            msg.setData(bundle);
            //发送消息
            handler.sendMessage(msg);
    

    这个时候在handlerMessage方法中即可收到消息,获取Message中的数据,并更新UI了。是不是很简单。

    相关文章

      网友评论

          本文标题:Android Handler使用

          本文链接:https://www.haomeiwen.com/subject/ifgwqltx.html