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