目录
一、背景
网络连接需要时间。Web 服务器可能需要 1~2 秒的时间来响应,文件下载则耗时更久。考虑到这个因素,Android 禁止任何主线程网络连接行为。即使强行为之,Android 也会抛出 NetworkOnMainThreadException 异常。
二、原因
这是为什么呢?要想知道答案,首先要知道什么是线程,什么是主线程,主线程有什么用途。线程是个单一执行序列。单个线程中的代码会逐步执行。所有 Android 应用的运行都是从主线程开始的。然而,主线程不是线程那样的预定执行序列。相反,它处于一个无限循环的运行状态,等着用户或系统触发事件。一旦有事件触发,主线程便执行代码做出响应。
三、理解
把应用想象成一家大型鞋店,闪电侠是这家店唯一的员工。(是不是人人梦寐以求的场景?) 要让客户满意,他需要做大量的工作,如布置商品、为顾客取鞋、为顾客量尺寸等。闪电侠并非 浪得虚名,所以,即便所有工作都由他一人完成,客户也能得到及时响应,感到满意。 为及时完成任务,闪电侠不能在单一事件上耗时过久。要是一批货丢了怎么办?这时,必须 有人花时间打电话调查此事。假设让闪电侠去做,他在忙于联络查找货物时,店里等候的顾客可 就不耐烦了。
闪电侠就像应用里的主线程。它运行着所有更新 UI 的代码,其中包括响应 activity 的启动、按钮的点击等不同 UI 相关事件的代码。(由于响应的事件基本都与用户界面相关,主线程有时也叫作 UI 线程。)
事件处理循环让 UI 代码总是按顺序执行。这样,事件就能一件件处理,不用担心互相冲突,同时代码也能够快速执行,及时响应。目前为止,我们编写的所有代码(刚刚使用 AsyncTask 工具类完成的代码除外)都是在主线程中执行的。