《android线程浅析》由会员分享,可在线阅读,更多相关《android线程浅析(8页珍藏版)》请在金锄头文库上搜索。
1、精品文档 欢迎下载Android 线程浅析摘要:随着中国移动在 8 月份相继发布基于 Google Android 的 OPhone 平台和手机网 上应用商店 Mobile Market,以及各大手机生产厂商在 2009 年北京国际通信展上展出了各 自基于 Android 的 手机,Android 技术受到越来越多的关注。基于这样的背景 下,本文将 通过一个例子来初探 Android 的线程模型。 关键词:Android ,UI thread,线程模型1 引言.12 Android 进程.13 单线程模型.23.1 案例演示.23.2 子线程更新 UI .43.3 Message Queue.
2、43.4 AsyncTask.64 综述.81 引言引言Android 一词本义指机器人,Google 于 2007 年 11 月发布了以 Android 命名的开源移 动设备综合平台,包括其基于 Linux 的操作系统、中间件和关键的手机应用。并且组建了 开放手机联盟,其成员囊括了全球著名的各大手机生产 商和移动运营商。2008 年 8 月, Google 又发布了网上应用商店 Android Market。任何一个开发者只需要借助 Android 发 布 的 SDK 开发手机应用,即可把开发的应用在 Android Market 上销售。目前 Android Market 上已经有一万多的
3、应用程序,大大丰富了 Android 手机用户的功能。一个完整的产业链已 经形成。因此开源 Android 吸引了原来越多的开发人员加入进来。本文将跟读者一起学习 Android 的线程模型。2 Android 进程进程在了解 Android 线程之间得先了解一下 Android 的进程。当一个程序第一次启动的时 候,Android 会启动一个 LINUX 进程和一个主线程。默认的情况下,所有该程序的组件都 将在该进程和线程中运行。同时,Android 会为每个应用程序分配一个单独的 LINUX 用户。 Android 会劲量保留一个正在运行进程,只在内存资源出现不足时,Android 会参试
4、停止一 些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足 够的资源去及时的响应用户的事件。Android 会 根据进程中运行的组件类别以及组件的状 态来判断该进程的重要性,Android 会 首先停止那些不重要的进程。按照重要性从高到低 一共有五个级别: 前台进程 前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他 们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说, 在这种情 况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。 可见进程 可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程是的重要程
5、度很高, 除非前台进程需要获取它的资源,不然不会被中止。 服务进程 运行着一个通过 startService() 方法启动的 service,这个 service 不属于上面提到的 2 种精品文档 欢迎下载更高重要性的。service 所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常 关注的任务(比如播放 mp3,从网络下载数据) 。只要前台进程和可见进程有足够的内存, 系统不会 回收他们。 后台进程 运行着一个对用户不可见的 activity(调用过 onStop() 方法).这些进程对用户体验没有 直接的影响,可以在服务进程、可见进程、前台进 程需要内存的时候回收。通常,系统中
6、会有很多不可见进程在运行,他们被保存在 LRU (least recently used) 列表中,以便内存不 足的时候被第一时间回收。如果一个 activity 正 确的执行了它的生命周期,关闭这个进程 对于用户体验没有太大的影响。 空进程 未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要 重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓 存的平衡。Android 对进程的重要性评级的时候,选取它最高的级别。另外,当被另外的一个进 程依赖的时候,某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服 务的进程重要级低。因为服务进程比后
7、台 activity 进程重 要级高,因此一个要进行耗时工 作的 activity 最好启动一 个 service 来做这个工作,而不是开启一个子进程特别 是这 个操作需要的时间比 activity 存在的时间还要长的时 候。例如,在后台播放音乐,向网上 上传摄像头拍到的图片,使用 service 可 以使进程最少获取到“服务进程”级别的重要级, 而不用考虑 activity 目 前是什么状态。broadcast receivers 做费时的工作的时候,也应该启 用一个服务而不是开一个线程。3 单线程模型单线程模型当一个程序第一次启动时,Android 会同时启动一个对应的 主线程(Main
8、Thread) , 主线程主要负责处理与 UI 相关的事件,如:用户的按键事件,用户接触屏幕的事件以及 屏幕绘图事 件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做 UI 线 程。在开发 Android 应用时必须遵守单线程模型的原则: Android UI 操作并不是线 程安全的并且这些操作必须在 UI 线程中执行。3.1 案例演示案例演示如果在没有理解这样的单线程模型的情况下,设计的程序可能会使程序性能低下,因 为所有的动作都在同一个线 程中触发。例如当主线程正在做一些比较耗时的操作的时候, 如正从网络上下载一个大图片,或者访问数据库,由于主线程被这些耗时的操作阻塞住,
9、无法及时的响 应用户的事件,从用户的角度看会觉得程序已经死掉。如果程序长时间不响 应,用户还可能得重启系统。为了避免这样的情况,Android 设 置了一个 5 秒 的超时时 间,一旦用户的事件由于主线程阻塞而超过 5 秒 钟没有响应,Android 会 弹出一个应用 程序没有响应的对话框。下面将通过一个案例来演示这种情况: 本程序将设计和实现查看指定城市的当天天气情况的功能, 1. 首先,需要选择一个天气查询的 服务接口,目前可供选择的接口很多,诸如 YAHOO 的 天气 API 和 Google 提 供的天气 API。 本文将选择 GOOGLE 的 天气查询 API。 该接口提供了多种查询
10、方式,可以通过指定具体城市的经纬度进行查询,也可以通 过城市名称进行查询。 2. 用户在输入框内输入需要查询的 城市名称,然后点击查询按钮 3. 当用户点击查询按钮后,使用已 经内置在 Android SDK 中的 HttpClient API 来调用 GOOGLE 的 天气查询 API, 然后解析返回的指定城市的天气信息,并把该天气信息显示精品文档 欢迎下载在 Title 上 主要代码如下:public class WeatherReport extends Activity implements OnClickListener private static final String GOO
11、GLE_API_URL = “http:/ static final String NETWORK_ERROR = “网络异常“;private EditText editText;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);editText = (EditText) findViewById(R.id.weather_city_edit);Button button = (Button) find
12、ViewById(R.id.goQuery);button.setOnClickListener(this);Overridepublic void onClick(View v) /获得用户输入的城市名称String city = editText.getText().toString();/调用 Google 天气 API 查询指定城市的当日天气 情况String weather = getWetherByCity(city);/把天气信息显示在 title 上setTitle(weather);public String getWetherByCity(String city) HttpClient httpClient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpGet =