使用AsyncTask类可以管理后台操作,这些后台操作最终会将结果返回UI线程
其相应的回调方法:onPreExecute()--- 后台处理开始之前在UI线程中运行
doInBackground()---- 实际后台运行在此完成
publicProgress()---- 此方法由doInBackground()调用 利用此可以将值返回给onProgressUpdata()
onProgressUpdata() --- 调用publicProgress()时执行此方法
onPostExecute() ---- 后台处理结束后执行此方法
其执行周期为由上到下执行
以进度条为例,其基本执行方式如下:单任务执行时默认排队执行(内部实现为Thread+ Handler)
public class MyAsynctask extends AsyncTask<Void, Integer, String>{ //实现方式,继承AsyncTask类 第一个参数,获取网络资源时设置,没有则为Void
<span style="white-space:pre"> </span>//第二个参数,调用<span style="font-family: Arial, Helvetica, sans-serif;">onProgressUpdate时使用,若不使用则为Void</span>
<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>//第三个参数,执行</span><span style="font-family: Arial, Helvetica, sans-serif;">onPostExecute参数,得到想要返回值类型,若不使用则为Void</span><span style="font-family:Arial, Helvetica, sans-serif;">
</span>
@Override
protected String doInBackground(Void... params) { //省略号为可变数组
for(int i = 1; i<=100;i++){
publishProgress(i); //将参数传递给onProgressUpdate中
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String progressSuccess = "加载完成";
return progressSuccess; //返回值返回到<span style="font-family: Arial, Helvetica, sans-serif;">onPostExecute中</span>
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
mPregressBar.setProgress(progress);
mProgressTxt.setText(""+progress);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
mProgressTxt.setText(result);
}
}
上方执行时为单任务执行,下面看一下多任务执行模式
Executor exec = new ThreadPoolExecutor(10, 100, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());//设置线程池活动线程数量和最大线程数
下方采用匿名内部类形式 image 为一网络地址数组 (下方会出现图片错乱情况)
<span style="white-space:pre"> </span>new AsyncTask<String, Void, Bitmap>(){
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
return downLoadImage(image[position]);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
gridview.setImageBitmap(result); //<span style="font-family: Arial, Helvetica, sans-serif;">gridview 为ImageView 在适配器中设置资源,防止重复加载 (此段代码在自定义适配器的getView方法中执行)</span>
}
// }.execute(image); //单任务执行
}.executeOnExecutor(exec, image) ; //多任务执行
/*
* 访问网络时需要在manifest加上网络权限 ,从网络获取图片资源
* */
public Bitmap downLoadImage(String httpUrl){
try {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}