网络连接需要时间。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. zabbix server端自动发现和zabbix agent端自动注册

    一.zabbix自动发现 利用zabbix的discovery功能可以实现自动批量添加主机的功能. Zabbix自动发现实现自定义主机名: 通过自动发现添加的客户端主机的Host name 是以IP地 ...

  2. 在swift中使用线程休眠

    C#和php都有sleep让线程休眠指定时间后再继续执行后面的代码,swift中应该如何呢?首先,找一下objective-c版本是怎么做的 [self performSelector:@select ...

  3. 【python】并行化的又一种思路

    https://segmentfault.com/a/1190000000414339

  4. 【LFM】隐语义模型

    模型解释: http://blog.csdn.net/harryhuang1990/article/details/9924377

  5. linux中如何对一个文件的内容进行处理,文件中每行有多个字段的值,中间用空格分隔开?

    需求描述: 今天在帮同事看个需求,将操作系统上的文件进行修改名字,改为特定的名字,所以呢,就先把这些原名字及对应的新名字关系放到了一个文本中,对于这个文本执行循环. 文件格式如下: .00000005 ...

  6. [Arch] 01. Before Design Patterns - UML

    From: 史上最全设计模式导学目录 设计模式,这是软件设计过程中的一个环节. 在这个环节之上,需要overview的事业,就是UML,一种通用的建模语言. Ref: 软件设计之UML—UML的构成[ ...

  7. [Module] 06 - DataBinding and MVVM

    下一步学习列表: Android DataBinding使用总结(一) *** Android DataBinding使用总结(二) Android DataBinding使用总结(三)列表展示 An ...

  8. c#POST请求php接口

    POST请求php接口 /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> /// <param name= ...

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

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

  10. Java利用数组随机抽取幸运观众

    编写程序,事先将所有观众姓名输入数组,然后获得数组元素的总数量,最后在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众的姓名. 思路如下: 定义输入框的按键事件,使用KeyEvent类的get ...