1.概述
AsyncTask是android提供的轻量级的异步类,实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask,用起来简单,过程也可控制,但是多个异步类对同一个UI进行操作时,过程变得复杂(不像Handler使用队列,不会出现多个同时执行)。
2.使用AsyncTask
(1).继承AsyncTask,覆写相应的方法
1).继承AsyncTask
/*
AsyncTask定义了三种泛型类型 Params,Progress和Result
Params 启动任务执行时接收的输入参数,比如要访问网络需要链接,设定为为 String
Progress 看台任务执行的进度,比如需要更新一个进度条,设定为Integer
Result 后台执行任务执行的结果,比如通过后台想得到一张图片,设定为BitMap
*/
class MyAsynTask extends AsyncTask<String, Integer, Bitmap>
2).覆写相应的方法
//Step 1
//在doInBackground()执行之前调用该方法,主要完成初始化工作。
protected void onPreExecute() {}
//Step 2
/* 在onPreExecute方法执行完毕后,执行该方法。
* 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。
* 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度
*/
protected Bitmap doInBackground(String... params) {}
//Step 2.1
//主要来更新任务进度,只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法
protected void onProgressUpdate(Integer... values) {}
//Step 3
//当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
protected void onPostExecute(Bitmap result) {}
//或者执行当用户取消操作后,后调用该方法
protected void onCancelled() {
super.onCancelled();
}
(2).实例化子类对象,并调用execute(params)方法
new MyAsynTask().execute(path);
3.应用(完成网络图片传输)
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button confirm;
private EditText pathText;
private ImageView imageView;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
confirm = (Button) this.findViewById(R.id.confirm);
pathText = (EditText) this.findViewById(R.id.path);
imageView = (ImageView) this.findViewById(R.id.image);
final String path = pathText.getText().toString();
confirm.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new MyAsynTask().execute(path);
}
});
}
class MyAsynTask extends AsyncTask<String, Integer, Bitmap>{
Bitmap bitmap = null;
/*
* 在doInBackground()执行之前调用该方法,主要完成初始化工作。
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(MainActivity.this);
dialog.setTitle("请稍后");
dialog.setMessage("正在下载 ...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.show();
}
/*
* 在onPreExecute方法执行完毕后,执行该方法。
* 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。
* 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度
*/
@Override
protected Bitmap doInBackground(String... params) {
String path = params[0];
try {
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
InputStream in = conn.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
long totalSize = conn.getContentLength();
long currentSize = 0;
byte[] bytes = new byte[1024];
int len = -1;
while((len=in.read(bytes)) != -1){
currentSize += len;
publishProgress((int) ((currentSize/(float)totalSize)*100));
bos.write(bytes, 0, len);
}
bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size());
return bitmap;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/*
* 主要来更新任务进度
* 只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
/*
* 当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
*/
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
imageView.setImageBitmap(bitmap);
dialog.dismiss();
}
/*
* 当用户取消操作后,后调用该方法
*/
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
}
}