android中UI线程不能执行耗时的操作,否则会抛出异常。因此,如果需要执行一个耗时的任务比如从网络上下载图片,就需要另外开启一个线程。
幸运的是,android提供了一个异步任务AsyncTask框架来完成类似场景的需求。
下面通过一个例子说明了如何使用AsyncTask。该例子程序点击button,会从网络上下载一个图片,显示在ImageView中。结果如底部的图片所示
使用AsyncTask的操作步骤
一、 第一步需要继承类AsyncTask ,重写继承的方法如onPreExecute()、doInBackground()、onPostExecute()等。
二、开启一个异步任务。只需new出继承了类AsyncTask的对象,调用execute方法就可开始执行。例如:new myAsyncTask().execute(path);
AsyncTask(String, Void, Bitmap); AsyncTask可以接收三个参数,第一个参数通常为要执行的路径,通常是网络路径、第二个参数表示进度、第三个参数表示执行任务的返回结果下面自定义了一个类继承AsyncTask
private class myAsyncTask extends AsyncTask<String, Void, Bitmap> {
// 更新UI线程中内容
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
imageview.setImageBitmap(result);
dialog.dismiss();
}
// 开始开启异步任务时执行
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog.show();
}
// 执行耗时的操作
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
// 使用网络链接类HttpClient完成网络数据的提取
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse 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 Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
}
接下来开启一个AsyncTask
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button:
new myAsyncTask().execute(path);
break;
default:
break;
}
}
完整的例子代码可以点击下面链接进行下载。