异步任务AsyncTask的使用

来源:互联网 发布:网络彩票开售 编辑:程序博客网 时间:2021/06/16 03:31

AsyncTask就是对Thread和Handler的结合进行了封装而已,在进行一些耗时的网络操作时使用。

第一步,定义一个类继承于AsyncTask类,代码如下:

private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);imageView.setImageBitmap(result);pd.dismiss();}@Overrideprotected void onPreExecute() {super.onPreExecute();pd.show();}@Overrideprotected 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;}@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.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字符串数组的某个元素