AsyncTask就是对Thread和Handler的结合进行了封装而已,在进行一些耗时的网络操作时使用。
第一步,定义一个类继承于AsyncTask类,代码如下:
private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
imageView.setImageBitmap(result);
pd.dismiss();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.show();
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
InputStream is = null;
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200){
is = httpResponse.getEntity().getContent();
long length = httpResponse.getEntity().getContentLength();
int len = 0;
byte[] buffer = new byte[1024];
long temp = 0;
ByteArrayOutputStream os = new ByteArrayOutputStream();
while((len = is.read(buffer))!= -1){
os.write(buffer,0,len);
temp += len;
int value = (int)((temp / length)*100);
publishProgress(value);
}
byte[] all = os.toByteArray();
bitmap = BitmapFactory.decodeByteArray(all, 0, all.length);
}
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
pd.setProgress(values[0]);
}
}
(1)AsyncTask类后面的三个参数的意义,第一个代表调用者传进来的参数的类型,第二个代表更新进度条的数据类 型,第三个代表整个处理结果返回的类型
(2)调用这个类的时候,首先会执行onPreExecute方法,该方法在处理耗时操作数据之前执行。
接着doInBackgroud方法执行,该方法就是用来处理耗时的操作,像上述代码的网络获取数据。
onProgressUpdate方法是用来更新进度条的最新进度值
onPostExecute方法是用来更新UI的,类似于主线程的Handler操作
(3)doInBackgroud方法里的publishProgress就是用来通知onProgressUpdate方法更新进度条的。
(4)doInBackgroud、onProgressUpdate、onPostExecute三个方法里的参数和AsyncTask类后的参数是一一匹配的。
第二步,主线程调用AsyncTask
new MyAsyncTask().execute(path);
其中path就是我们传进来访问网络的URL字符串。该path会传给
doInBackgroud的参数params字符串数组的某个元素