android的类AsyncTask对线程间的通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯,后台线程执行异步任务,并把操作结果通知UI线程。
AsyncTask<Params, Progress, Result>定义了三种泛型类型。
Params:启动任务执行的参数,比如HTTP请求的URL
Progress:后台任务执行的百分比
Result:后台执行任务的最终返回结果。
AsyncTask 的执行分为四个步骤;
1:继承AsyncTask
2:根据自己的需要定义下面的一个或多个方法。
OnPreExecute ()该方法将在执行实际的后台操作前被UI线程调用,可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
DoInBackground (String... params)将在OnPreExecute方法执行后马上执行,该方法在后台运行,这里主要负责处理那些耗时的后台处理工作,可以调用publishProgress()方法来实时更新实时的任务的进度。
onProgressUpdate ()在publishProgress方法被调用后,UI线程将调用这个方法从而在界面上展示任务的进展情况(通过进度条进行显示)
onPOSExecute(Result): 在DoInBackground()执行完成后,onPOSExecute()将被执行,后台计算的结果将通过该方法传递到ui线程,并且在界面展示给用户。
使用AsyncTask注意的事项:
Task的实例必须在UI线程中创建。
execute方法必须在UI线程中调用。
task 只能执行一次,否则多次调用将会出现异常。
使用AsyncTask下载网络图片:
示例代码如下:
public class MainActivity extends Activity {
private Button button;
private ImageView imageView;
private String imagepath = "http://a.hiphotos.baidu.com/image/pic/item/dbb44aed2e738bd453b9a83fa38b87d6277ff920.jpg";
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialog = new ProgressDialog(this);
dialog.setTitle("提示信息");
dialog.setMessage("正在下载请稍后。。。");
button = (Button) findViewById(R.id.button);
imageView = (ImageView) findViewById(R.id.imageView);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute(imagepath);
}
});
}
/*
* 使用异步任务的规则1 声明一个类继承AsyncTask 标注三个参数的类型 2 第一个参数表示要执行的任务通常是网络路径,第二个参数表示进度的刻度
* 第三个参数表示任务执行的返回结果。
*/
public class MyTask extends AsyncTask<String, Void, Bitmap> {
@Override
// 主要是完成耗时操作
protected Bitmap doInBackground(String... params) {
// 使用网络连接类HttpClient类完成对网络的提取
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
HttpResponse httpResponse;
try {
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
byte[] data = EntityUtils.toByteArray(httpEntity);
bitmap = BitmapFactory
.decodeByteArray(data, 0, data.length);
}
} catch (ClientProtocolException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return bitmap;
}
// 主要完成更新UI操作
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
imageView.setImageBitmap(result);
dialog.dismiss();
}
@Override
// 表示任务执行前的操作
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
}
}
使用带进度条的显示并下载图片
示例代码如下:
public class MainActivity extends Activity {
private Button button;
private ImageView view;
private String imageView_path = "http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1409/06/c10/38325194_1409998399958_mthumb.jpg";
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setMessage("正在下载,请稍后。。。。");
// 设置进度条的样式让其横向显示
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
view = (ImageView) findViewById(R.id.imageView);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute(imageView_path);
}
});
}
class MyTask extends AsyncTask<String, Integer, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
// 完成对图片的下载
Bitmap bitmap = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream inputStream = null;
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
inputStream = httpResponse.getEntity().getContent();
// 先要获得文件的总长度
long File_length = httpResponse.getEntity()
.getContentLength();
int len = 0;
byte[] data = new byte[1024];
int total_length = 0;
int values = 0;
while ((len = inputStream.read(data)) != -1) {
total_length += len;
values = (int) ((total_length / (float) File_length) * 100);
publishProgress(values);
outputStream.write(data, 0, len);
}
byte[] result = outputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(result, 0,
result.length);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
dialog.dismiss();
view.setImageBitmap(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
}
}