AsyncTask简介及使用


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线程将调用这个方法从而在界面上展示任务的进展情况(通过进度条进行显示)

onPOSExecuteResult): 在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]);

}

}

}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值