Android为了降低异步操作开发难度,结合Handler和线程池,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。他具有可以在后台执行耗时操作,同时可以将执行进度与UI进行同步的优点。
二、如何使用AsyncTask
AsyncTask定义了三种泛型类型params,progress和result。
Params 启动任务执行的输入参数,比如HTTP请求的URL.
Progress后台任务执行的百分比。
Result后台执行任务最终返回的结果,比如String。
AsyncTask方法
必选方法:
doInBackground(Params)后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
onPostExecute(Result)相当于Handler处理UI的方式,在这里面可以使用doInbackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为 此方法的参数返回。
可选方法:
onProgressUpdate(Progress...) 可以使用进度条增加用户体验度。此方法在主线程执行,用于显示任务执行的进度。
onPreExceute() 这里是最终用户调用Exceute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled()用户调用取消时,要做的操作。
AsyncTask三个状态:pending,running,finished
三、规则
1.AsyncTask必须在主线程中创建
2.execute()只能调用一次
3.execute()必须在主线程执行
4.不要自己调用onPreExecute(),onProstExecute(),doInBackground(),onProgressUpdate()
四、分析AsyncTask的实现原理
五、分析AsyncTask和Handler谁更消耗资源
AsyncTask比Handler更消耗资源
六、什么时候使用AsyncTask,什么时候使用Handler
任务可以被中止,并需要不断和使用时AsyncTask
任务需要被多次重复执行,且和UI交互少时用Handler
七、代码
1.定义layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText android:id="@+id/edittext_www"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<ProgressBar android:id="@+id/progressbar_www"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/textview_www_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/button_www_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新"/>
</LinearLayout>
2.java中实现
package com.douzi.treaddemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
public class MemoryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
handlerTest();
//asyncTaskTest();
}
/**
* 主线程中执行
*/
private void handlerTest(){
Handler handler = new Handler();
handler.postDelayed(mBlockAction,100);
}
private void asyncTaskTest(){
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
mBlockAction.run();
return null;
}
};
}
private Runnable mBlockAction = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}