zoukankan      html  css  js  c++  java
  • Android 线程与主线程

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

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

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

    超越主线程

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

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

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

  • 相关阅读:
    mysql中字符集和排序规则说明
    结束进程的批处理文件
    内有干货!2个人3个月怎样从零完毕一款社区App《林卡》
    九度OJ 1006 ZOJ问题 (这题測试数据有问题)
    简易版的堆的写法
    hbase
    JNDI配置c3p0连接池
    [effictive c++] 条款04 确定对象被使用前已被初始化
    第九十五题(推断一字符串是不是对称的)
    OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码
  • 原文地址:https://www.cnblogs.com/onelikeone/p/9460282.html
Copyright © 2011-2022 走看看