android线程异步处理之AsyncTask

android应用是单线程模式的。

 

单线程模式需要记住两条:

 

一、防止UI线程阻塞

二、确保只在UI线程中访问Android UI工具包


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

 

在此介绍下何谓UI线程:当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负

 

责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件

 

进行处理。所以主线程通常又被叫做UI线程。

 

什么情况下会出现线程阻塞?如在登录时,一般会去访问网络,这个需要一段时间,如果写带UI线程中,则会出现界面假死

 

现象,也就是界面卡住不支持用户交互,这一点在要求高交互的手机上肯定是不能容许的。ok,这个时候你可能会去考虑新

 

开一个线程或者在后台线程中来执行耗时的操作,如下面的例子:

public void onClick( View v ) {  

new Thread( new Runnable() {   

    public void run() {  

Bitmap b = loadImageFromNetwork();   //从网络上下载图片

mImageView.setImageBitmap( b );  //把图片设置给ImageView

}

    }).start()

 }

上面的代码会报错,你可能会说逻辑很正确啊,但是它违背了Android单线程模型:Android UI操作并不是线程安全的并且

 

这些操作必须在UI线程中执行。

 

Andriod提供了几种在其他线程中访问UI线程的方法:

 

Activity.runOnUiThread( Runnable )

View.post( Runnable )   

View.postDelayed( Runnable, long )   

Hanlder

 

下面引人android的异步处理机制:Handler和AsyncTask。其中AsyncTask比hander更轻量级一些。在Android1.5中

 

提供了AsyncTask。它使创建需要与用户界面交互的长时间运行的任务变得更简单。

 

AsyncTask 的优势体现在:
•线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多; 

•线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统
将不堪重负。 

•另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
 
AsyncTask定义了三种泛型类型 Params,Progress和Result。
    •Params 启动任务执行的输入参数,比如HTTP请求的URL。 
    •Progress 后台任务执行的百分比。 
    •Result 后台执行任务最终返回的结果,比如String。

 

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现一个或几个方法。在任务的执行过程中,
这些方法被自动调用。
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上
显示一个进度条。doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。
这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象
方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任
务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结
果将通过该方法传递到UI thread.
 
使用AsyncTask类,以下是几条必须遵守的准则:
    1) Task的实例必须在UI thread中创建
    2) execute方法必须在UI thread中调用
    3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
    4) 该task只能被执行一次,否则多次调用时将会出现异常

 

 

你可能感兴趣的:(Android)