在开发Android移动客户端的时分往往要运用多线程来进行操作,咱们一般会将耗时的操作放在独自的线程履行,防止其占用主线程而给用户带来欠好的用户体会。可是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现过错。因而android供给了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,出现给用户。这样就处理了子线程更新UI的问题。可是费时的使命操作总会发动一些匿名的子线程,太多的子线程给体系带来巨大的担负,随之带来一些功能问题。因而android供给了一个东西类AsyncTask,望文生义异步履行使命。这个AsyncTask生来便是处理一些后台的比较耗时的使命,给用户带来杰出用户体会的,从编程的语法上显得高雅了许多,不再需求子线程和Handler就能够完结异步操作而且改写用户界面。
先大约知道下Android.os.AsyncTask类:
* android的类AsyncTask对线程间通讯进行了包装,供给了简易的编程办法来使后台线程和UI线程进行通讯:后台线程履行异步使命,并把操作成果告诉UI线程。
* AsyncTask是笼统类.AsyncTask界说了三种泛型类型 Params,Progress和Result。
* Params 发动使命履行的输入参数,比方HTTP恳求的URL。
* Progress 后台使命履行的百分比。
* Result 后台履行使命终究回来的成果,比方String,Integer等。
* AsyncTask的履行分为四个过程,每一步都对应一个回调办法,开发者需求完成这些办法。
* 1) 承继AsyncTask
* 2) 完成AsyncTask中界说的下面一个或几个办法
* onPreExecute(), 该办法将在履行实践的后台操作前被UI 线程调用。能够在该办法中做一些准备工作,如在界面上显现一个发展条,或许一些控件的实例化,这个办法能够不必完成。
* doInBackground(Params…), 将在onPreExecute 办法履行后立刻履行,该办法运转在后台线程中。这儿将首要担任履行那些很耗时的后台处理工作。能够调用 publishProgress办法来更新实时的使命发展。该办法是笼统办法,子类有必要完成。
* onProgressUpdate(Progress…),在publishProgress办法被调用后,UI 线程将调用这个办法从而在界面上展现使命的发展状况,例如经过一个发展条进行展现。
* onPostExecute(Result), 在doInBackground 履行完结后,onPostExecute 办法将被UI 线程调用,后台的计算成果将经过该办法传递到UI 线程,而且在界面上展现给用户.
* onCancelled(),在用户撤销线程操作的时分调用。在主线程中调用onCancelled()的时分调用。
为了正确的运用AsyncTask类,以下是几条有必要恪守的原则:
1) Task的实例有必要在UI 线程中创立
2) execute办法有必要在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个办法,需求在UI线程中实例化这个task来调用。
4) 该task只能被履行一次,不然屡次调用时将会出现异常
doInBackground办法和onPostExecute的参数有必要对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground承受的参数,第二个为显现发展的参数,第第三个为doInBackground回来和onPostExecute传入的参数。
下面经过一个Demo来阐明怎么运用Android.os.AsyncTask类,经过发展条来显现进行的发展,然后用TextView来显现发展值。程序结构图如下:

[1] \layout\main.xml 布局文件源码如下:
[html] view plain copy
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
>
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Hello , Welcome to Andy’s Blog!/>
android:id=@+id/download
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Download/>
android:id=@+id/tv
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=当时发展显现/>
android:id=@+id/pb
android:layout_width=fill_parent
android:layout_height=wrap_content
style=?android:attr/progressBarStyleHorizontal/>
[2] /src中的MainActivity.java源码如下:
[html] view plain copy
package com.andyidea.demo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
Button download;
ProgressBar pb;
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb=(ProgressBar)findViewById(R.id.pb);