网络连接需要时间。Web服务器可能需要1~2秒的时间来响应,文件下载则耗时更久。考虑
到这个因素,Android禁止任何主线程网络连接行为。即使强行为之,Android也会抛出
NetworkOnMainThreadException异常。
这是为什么呢?要想知道答案,首先要知道什么是线程,什么是主线程,主线程有什么用途。
线程是个单一执行序列。单个线程中的代码会逐步执行。所有Android应用的运行都是从主
线程开始的。然而,主线程不是线程那样的预定执行序列。相反,它处于一个无限循环的运行状
态,等着用户或系统触发事件。一旦有事件触发,主线程便执行代码做出响应。

把应用想象成一家大型鞋店,闪电侠是这家店唯一的员工。(是不是人人梦寐以求的场景?)
要让客户满意,他需要做大量的工作,如布置商品、为顾客取鞋、为顾客量尺寸等。闪电侠并非
浪得虚名,所以,即便所有工作都由他一人完成,客户也能得到及时响应,感到满意。
为及时完成任务,闪电侠不能在单一事件上耗时过久。要是一批货丢了怎么办?这时,必须

有人花时间打电话调查此事。假设让闪电侠去做,他在忙于联络查找货物时,店里等候的顾客可
就不耐烦了。
闪电侠就像应用里的主线程。它运行着所有更新UI的代码,其中包括响应activity的启动、按
钮的点击等不同UI相关事件的代码。(由于响应的事件基本都与用户界面相关,主线程有时也叫
作UI线程。)
事件处理循环让UI代码总是按顺序执行。这样,事件就能一件件处理,不用担心互相冲突,
同时代码也能够快速执行,及时响应。目前为止,我们编写的所有代码(刚刚使用AsyncTask工
具类完成的代码除外)都是在主线程中执行的。

超越主线程

连接网络如同致电分销商找丢失的货物:相比其他任务,它更耗时。等待响应期间,用户界
面毫无反应,这可能会导致应用无响应(application not responding,ANR)现象发生。
如果Android系统监控服务确认主线程无法响应重要事件,如按下后退键等,则应用无响应
会发生。

回到假想的鞋店中,要解决问题,自然想到再雇一名闪电侠专门负责联络供销商。Android
系统中的做法与之类似,即创建一个后台线程,然后从该线程访问网络。
怎样使用后台线程最容易?使用AsyncTask工具类。

参考:Android编程权威指南-第3版

Android 线程与主线程的更多相关文章

  1. 2017-11-29 由runnable说起Android中的子线程和主线程

    1.首先纠正一个观点,就是runnable运行在子线程中是错误的观念.runnable只是创建了一个执行任务的对象,但是它本身并不会创建一个新的子线程,Runable只是给你接口让你实现工作线程的工作 ...

  2. C#用副线程改主线程(UI线程)的控件属性的方法(包括Winform和WPF)

    C#用副线程去试图修改主线程的UI控件会报出异常,解决方案是使用副线程注册事件通知主线程自己去修改UI控件 在winform中,方法如下 private void button1_Click(obje ...

  3. android 更新uI主线程

    http://www.cnblogs.com/wenjiang/p/3180324.html handleMessage 好用

  4. 在子线程更新主线程的UI组件

    1.实例化一个 private Handler handlerBublishTopic = new Handler(Looper.getMainLooper()); 2. handlerBublish ...

  5. WinForm子线程调用主线程

    public Form1() { InitializeComponent(); Thread t = new Thread(ThreadWorker); t.Start(); } private vo ...

  6. Android ActivityThread(主线程或UI线程)简介

    1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client ...

  7. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  8. 利用进程ID获取主线程ID

    利用进程ID获取主线程ID,仅适用于单线程.多线程应区分哪个是主线程,区分方法待验证 (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了 ...

  9. c# 子线程如何通知主线程,个人总结

    我要实现的功能如下:程序中有2个线程,主线程和子线程,主线程中有一个变量:X主线程运行中激活子线程,子线程会做出计算改变 X 的值,主线程继续做其它的事,直到 X 的值发生改变时,才会响应,并在tex ...

随机推荐

  1. C# Bitmap/png转成jpg格式,压缩图片

    public static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecIn ...

  2. 【WP8】键盘弹出时控制Frame位置

    WP上,当使用TextBox输入文字的时候,键盘会把TextBox向上推一段距离 当编辑第二个TextBox的时候,页面被上推,键盘刚好和TextBox靠在一起 当编辑第一个TextBox的时候,页面 ...

  3. vue实现点击关注之后及时更新列表

    如图,我要实现点击关注之后列表及时更新成最新的列表. 思路很简单,主要是两点: 1.在点击关注之后去执行一个请求新的关注列表的action: 2.在vue组件中watch监听已关注列表和推荐关注列表 ...

  4. Spring MVC异常处理详解 ExceptionHandler good

    @ControllerAdvice(basePackageClasses = AcmeController.class) public class AcmeControllerAdvice exten ...

  5. BarTender数据中的转义符序列知识讲解

    Datamatrix是二维码的一个成员,广泛用于商品的防伪.统筹标识.如果为 Data Matrix 条形码指定的“符号类型”不是 ECC 200,则将会启用“字符集”选项.Data Matrix 也 ...

  6. BIOS、EFI与UEFI详解

    https://blog.csdn.net/Scythe666/article/details/79708293

  7. 第二种方式,修改python unittest的执行顺序,使用猴子补丁

    1.按照测试用例的上下顺序,而不是按方法的名称的字母顺序来执行测试用例. 之前的文章链接 python修改python unittest的运行顺序 之前写的,不是猴子补丁,而是要把Test用例的类名传 ...

  8. HTTPS原理,以及加密、解密的原理。

    https://blog.csdn.net/Yang_yangyang/article/details/79702583 摘要:本文用图文的形式一步步还原HTTPS的设计过程,进而深入了解原理. A在 ...

  9. VMWARE workstation 9 收缩虚拟硬盘

    在9以前的版本中可以通过在客户机中vmtools收缩硬盘,而在9以后这个功能没有了.虚拟机中使用过的虚拟硬盘即使删除了所有数据,使用vmware workstation 9 的clean up dis ...

  10. 【遥感影像】Python GDAL 像素与坐标对应

    转:https://blog.csdn.net/theonegis/article/details/50805520 https://blog.csdn.net/wsp_1138886114/arti ...