鸿 网 互 联 www.68idc.cn

Android线程处理简述

来源:互联网 作者:佚名 时间:2013-08-25 07:43
Android线程处理简述附件工程是有关Android线程的,里面对的错的方式都有。遇到报错那就对了,先熟悉了,以后才更清楚不是吗^^。..

 Android线程处理简述

         附件工程是有关Android线程的,里面对的&错的方式都有。遇到报错那就对了,先熟悉了,以后才更清楚不是吗^^。

         还有,运行结果就不都截图了,懒人一个T^T。

 

一、基础篇

1)UI线程概念

         Android为单线程模型。当一个程序第一次启动时,Android会自动创建一个对应的主线程(Main Thread)。它负责把事件分派到相应的控件,用于用户与Android控件进行交互。所以通常又被叫做UI线程。

         在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

         简单表述为:1、不要阻塞UI线程;2、只能在主线程操作UI。

 

         详见Android帮助文档Dev Guide,左侧栏Processes and Threads。

 

2)UI线程示例

2.1)UI线程阻塞

         不考虑Android单线程模型,将所有任务都在该线程中执行,尤其是某些耗时操作,会使得整个用户界面被阻塞。从用户角度来看,就是按键或触屏后响应很慢甚至毫无响应。而且当应用程序阻塞的时间过长时,香港服务器,Android还会向用户提示一个无响应的对话框(不截了==)。

 

2.2)非主线程更新UI

         1、LogCat会报如下的错误消息:

         Uncaught handler: thread Thread-9 exiting due to uncaught exception。

         android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

         2、Android会向用户提示一个强行关闭的对话框(又不截了==)。

 

2.3)非主线程更新UI

         三种方式:①Handler;②View.post(Runnable);③Activity.runOnUiThread(Runnable)。

 

2.4)好了,开始动手测试吧^^

         亲,记得看Log日志出的线程id哦。(卖下萌,不介意吧?)

 

二、提高篇

1)Android消息处理机制

         熟悉Android开发的可能知道其应用程序都是由消息驱动的。参考了Windows的消息循环机制,Android系统通过Handler、Thread、Looper以及MessageQueue实现了这种消息机制。相关的类都被定义在了package android.os。

         推荐这篇博客咯——解析Android消息处理机制。(这个,那个,还建模==)

 

2)实用的消息处理方式

2.1)Thread实现消息循环

         如果不使用Looper.prepare()及loop()的话,就不能创建Handler将消息处理加入到Looper中。LogCat会报“Can't create handler inside thread that has not called Looper.prepare();”的错误信息。

 

2.2)Handler与Looper相关联

         如果构造一个无参的Handler对象,它将自动与当前运行线程相关联。可以注意Handler相关例子中打印出的当前线程ID信息。

         而与Looper相关联,需要创建一个带参数的Handler对象。注意:此时线程类应该是一个HandlerThread类,一个Looper类的Thread类。

 

         所以,Wifi的HandlerThread,WifiHandler可以这样实例化(推荐博客有述): 

 

2.3)Hanlder与Thread实现异步

         在新线程中执行耗时操作,结束后通过Handler来更新UI。

 

3)Android异步线程——AsyncTask

         当任务需要复杂操作并频繁更新UI时,上述的非主线程访问UI方法会使得代码结构复杂和难以理解。所以Android1.5提供了一个工具类AsyncTask,用以创建与用户界面交互的长时间任务。也在被定义在了package android.os。

         AsyncTask定义了3种泛型类型: Params, Progress and Result;4个执行步骤:onPreExecute, doInBackground, onProgressUpdate and onPostExecute。

 

3.1)泛型类型

         1) Params,发送给后台任务处理的参数类型

         2) Progress,香港虚拟主机,后台任务过程中发布的进度单位

         3) Result,后台任务结束后返回的结果类型


         想了解泛型类型的话,可参见我的Java泛型应用浅析一文^^。

 

3.2)执行步骤

         1) onPreExecute(),该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

         2) doInBackground=\'#\'" publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

         3) onProgressUpdate(Progress...),在publishProgress方法被调用后,香港虚拟主机,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

         4) onPostExecute(Result),在doInBackground执行完成后,onPostExecute方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread。

 

         onPostExecute的参数为doInBackground的返回值,类型由第三个泛型类型所指定。例子里仅是String,也可以是你自己的实体类、接口什么的。

 

3.3)使用准则

         1) Task的实例必须在UI thread中创建

         2) execute方法必须在UI thread中调用

         3) 不要手动的调用onPreExecute(), onPostExecute(Result),

doInBackground=\'#\'" onProgressUpdate(Progress...)这几个方法

         4) 该task只能被执行一次,否则多次调用时将会出现异常

 

3.4)任务取消

网友评论
<