一、Handler是什么
Android定义的一套 子线程与主线程间通讯的消息传递机制 。
二、Handler有什么用
把子线程中的UI更新信息,传递给主线程(UI线程),以此完成UI更新操作。
三、为什么要用Handler,不用行不行
不行,Handler是android在设计之初就封装了的一套消息创建、传递、处理机制。
Android要求我们在主线程中更新UI,是要求,建议,不是规定,硬要在子线程中更新UI,也是可以的!
比如,在一个子线程中,创建一个对话框:
而我们平时在子线程中更新UI报错是这样的:
子线程更新UI也行,但是只能更新自己创建的View!Android的UI更新被设计成了单线程。
再说一个网上很常见的主线程更新UI的例子:
上面这段代码直接在子线程中更新了UI,却没有报错:
但如果在子线程中加句线程休眠模拟耗时操作的话:
程序就崩溃了,报错如下:
前面说了Android的UI更新被设计成单线程,这里妥妥滴会报错,但却发生在延迟执行后?
原因是:ViewRootImp在onCreate()时还没创建;在onResume()时,即ActivityThread的 handleResumeActivity()执行后才创建,调用requestLayout(),走到checkThread()时就报错了。
四、真的不能在主线程中做网络操作吗?
上述代码运行直接闪退,日志如下:
在 onCreate() 的 setContentView() 后插入下面两句代码:
运行下看看:
StrictMode(严苟模式)
Android 2.3 引入,用于检测两大问题:ThreadPolicy(线程策略) 和 VmPolicy(VM策略)
把严苟模式的网络检测关了,就可以在主线程中执行网络操作了,不过一般是不建议这样做的:
在主线程中进行耗时操作,可能会导致程序无响应,即 ANR (Application Not Responding)。
至于常见的ANR时间,可以在对应的源码中找到:
// ActiveServices.java → Service服务
static final int SERVICE_TIMEOUT = 20*1000; // 前台
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10; // 后台