AsyncTask--抽象类
<Params,Progress,Result> (没有就是Void)
Params:传入异步任务的参数类型(通过.excute()传入)
Progress:任务执行中产生的数据类型,通过publishProgress方法传到onProgressUpdate来处理
Result:任务执行完以后返回的数据类型,在onPostExecute中来处理
asyncTask.execute(Params); //执行任务,需要传参数,就直接加
asyncTask.cancel(true); //可以停止任务
注:他的任务是在一个任务队列依次执行
通过继承AsyncTask这个类来重写他的方法
下面是模拟下载进度的示例:
<span style="font-size:14px;">/*
* <Params,Progress,Result> 三个参数类型Params:传入异步任务的参数类型(通过.excute()传入)
* Progress:任务执行中产生的数据类型,通过publishProgress方法传到onProgressUpdate来处理
* Result:任务执行完以后返回的数据类型,在onPostExecute中来处理
*/
public class MyAsyncTask extends AsyncTask<Void, Integer, String> {
/*
* 最先执行的方法
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/*
* 执行异步任务,属于子线程,不能更新UI线程
* 返回的值为onPostExecute方法中的参数
*/
@Override
protected String doInBackground(Void... params) {
for (int i = 0; i < 100; i++) {
mSbar.setProgress(i);
publishProgress(i);// i 为onProgressUpdate方法的值参
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String result = "下载完成";
return result;
}
/*
* 处理异步任务中通过publishProgress(??)发送的值 控件的刷新,参数values为doInBackground方法中通过
* publishProgress(values)传过来的值
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mShowTxt.setText(values[0] + "");
}
/*
* 处理异步任务完成后的返回值 上面任务执行完以后再执行的代码,参数result 为doInBackground方法中返回的值
*/
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
mShowTxt.setText(result);
}
}</span>
以下是简单从网上下图片设置给gridview
executeOnExecutor(Executor,Params) //多任务同时执行
Executor:
<span style="white-space:pre"> <span style="font-size:14px;"> </span></span><span style="font-size:14px;">Executor mExecutor;
//10 150 1 0 对应: 同時执行的线程数/ 总线程数/ 執行時間,時間一到,線程會被摧毀
mExecutor = new ThreadPoolExecutor(10, 150, 10, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
GridViewAdapter adapter = new GridViewAdapter(this);
mGrid.setAdapter(adapter);
adapter.setData(mImageDta);</span>
<span style="font-size:14px;">public class GridViewAdapter extends BaseAdapter {
String[] mImageDta = {};
private LayoutInflater infalter;
public void setData(String[] imageDta) {
this.mImageDta = imageDta;
notifyDataSetChanged();//刷新数据源
}
public GridViewAdapter(Context context) {
infalter = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mImageDta.length;
}
@Override
public Object getItem(int position) {
return mImageDta[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageview;
if (convertView == null) {
convertView = infalter.inflate(
R.layout.imgview_child_gridview_layout, null);
imageview = (ImageView) convertView
.findViewById(R.id.img_child_grid);
convertView.setTag(imageview);
} else {
imageview = (ImageView) convertView.getTag();
}
String httpUrl = (String) getItem(position);
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
return downLoadPicture(params[0]);
}
protected void onPostExecute(Bitmap result) {
if (result != null) {
imageview.setImageBitmap(result);
}
}
}.execute(httpUrl); // 单任务一个一个执行
// }.executeOnExecutor(mExecutor,httpUrl); //多任务同时执行
return convertView;
}
}</span>
<span style="font-size:14px;">/**
* 网络下载图片
*/
public Bitmap downLoadPicture(String httpUrl) {
try {
URL url = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}</span>