Android Handler使用

2021-03-10  本文已影响0人  CodeDuan

在日常开发中,都避免不了进行网络请求,并更新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了。是不是很简单。

上一篇下一篇

猜你喜欢

热点阅读