AsyncTask异步访问网络数据
AsyncTask<Params,Progress,Result>
Params : 在处理异步任务的时候需要的类型参数
Progress : 完成的进度
Result : 异步任务返回的结果
<div>2、AsyncTask的执行流程</div><div> class LoadingImageTask
extends AsyncTask<String, Integer, InputStream>{
/**
* 在任务执行之前的方法回调
* 比如:任务执行之前打开进度对话框
*/
@Override
protected void onPreExecute() {
}
/**
* 处理异步任务
*/
@Override
protected InputStream doInBackground(String... params) {
while(true){
//更新进度,publishProgress会自动调用onProgressUpdate方法
this.publishProgress(0);
}
return null;
}
/**
* 任务结束之后的方法回调
* 比如:任务结束之后关闭进度条对话框
*/
@Override
protected void onPostExecute(InputStream result) {
super.onPostExecute(result);
}
/**
* 更新进度
*/
@Override
protected void onProgressUpdate(Integer... values) {
}
}</div>
A、任务执行前,回调onPreExecute()方法
B、任务执行时,调用doInBackground()方法来处理任务,必须调用publishProgress()方法来调用onProgressUpdate()方法更新进度
C、任务结束后,回调onPostExecute()方法
网络上异步下载图片案例
package com.xcl.android;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.xcl.asynctask.R;
public class AsyncTask_Acitvity extends Activity {
private TextView text;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask);
ID();
}
/**
* 找到ID
*/
public void ID() {
text = (TextView) findViewById(R.id.text);
img = (ImageView) findViewById(R.id.img);
}
/**
*
* @param 下载网络图片的单击事件
*/
public void download(View v) {
AsyncTask_content asy = new AsyncTask_content();
asy.execute("http://gson.cn/out/abc.jpg");//启动异步请求
}
/**
*
* @author 异步类
*
*/
class AsyncTask_content extends AsyncTask<String, Integer, byte[]> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
// 在任务执行之前回调
dialog = new ProgressDialog(AsyncTask_Acitvity.this);
dialog.setTitle("下载图片");
dialog.setMessage("正在下载");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
super.onPreExecute();
}
@Override
protected byte[] doInBackground(String... arg0) {
// 处理异步任务
try {
URL url = new URL(arg0[0]);
HttpURLConnection com = (HttpURLConnection) url
.openConnection();
int total = com.getContentLength();// 得到总共的字节
dialog.setMax(total);// 这是进度条最大值
byte[] bytes = new byte[1024];// 限制一次只能读1024
byte[] Array = new byte[total];// 存储已经读过的字节
int indexs = 0;
InputStream input = com.getInputStream();
int len = input.read(bytes);
while (len > 0) {
for (int i = 0; i < len; i++) {
Array[i + indexs] = bytes[i];
}
indexs += len;
len = input.read(bytes);
publishProgress(indexs);
}
return Array;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(byte[] result) {
// 任务结束之后回调
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0,
result.length);
img.setImageBitmap(bitmap);
dialog.dismiss();
}
@Override
protected void onProgressUpdate(Integer... values) {
// 更新
int index = values[0];
dialog.setProgress(index);
}
}
}
效果图