Android List列表网络资源异步调用
来源:互联网 发布:第五届厦门网络文化节 编辑:程序博客网 时间:2024/04/28 15:49
引言
曾经我在eoe上发了一篇帖子,关于List网络图片异步调用的,后来好多朋友给我留言、发站内消息索要要代码和具体实现方式,当时我也一并答应了,但苦于一直抽不出来时间,且要的人越来越多,挨个发实在麻烦,一直拖到今天。实在抱歉。
今天下午有点时间,我就在此整理整理,尽量详细的写出来,有疑问的可以在文章后方留言。
概要
首先大家都知道,有时候一个List(列表)里会用到网络图片之类的资源,应用有时会根据服务器提供的数据去调用并显示在List里,但如果一次性全部读取效率可想而知。这样我们就需要一个机制,让程序去获取数据量较小的文字简介之类的信息,同时在后台异步获取网络/服务器上数据量较庞大的数据资源,例如图片。
解决这个需求当然Android是有很多解决方案的。最容易维护,代码量最小且封装效率最好的实现方式是使用AsyncTask。使用匿名线程的话第一开销较大,不方便管理,且更新UI必须要引入handler,相当繁杂且代码会显的非常臃肿。
AsyncTask
首先AsyncTask是一个抽象类,子类继承AsyncTask必须实现其抽象方法doInBackground(Params…)。同时我们还需要实现onPostExecute(Result),因为结果会在Result中返回。
AsyncTask的生命周期
AsyncTask的生命周期分为四部分,每部分对应一回调方法,我们只需实现这些方法中的某些需要用到的方法。程序执行过程中这些会自动调用它们。
- onPreExecute():任务执行之前执行,可在这显示进度条。
- doInBackground(Params…):后台执行,主要用于完成需要任务。执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
- onProgressUpdate(Progress…):主线程执行,用于显示任务执行的进度。
- onPostExecute(Result):主线程执行,任务执行的结果作为此方法的参数返回。
AsyncTask中的三种泛型
AsyncTask中的三种泛型类型为Params、Progress、Result。
- Params:启动任务参数,比如请求的资源地址。
- Progress:顾名思义,后台任务执行的百分比。
- Result:后台执行任务返回的结果。
AsyncTask的执行
AsyncTask只能在在主线程中创建实例,创建实例后使用execute(params)执行。任务仅会执行一次,如果想再调用就必须创建新的实例。
具体实现
首先我们先继承实现AsyncTask,然后在主线程的getView()里创建其实例execute().
1、实现AsyncTask
public class DownImageTask extends AsyncTask {private ImageView gView; protected Bitmap doInBackground(ImageView... views) {Bitmap bmp = null;ImageView view = views[0];HotelListData.Item item;// 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。if (view.getTag() != null) {try {item = (HotelListData.Item) view.getTag();URL url = new URL(item.getI().toString());HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.connect();InputStream stream = conn.getInputStream();bmp = BitmapFactory.decodeStream(stream);Data.imageMap.put(item.getId(), bmp);stream.close();} catch (Exception e) {Log.v("img", e.getMessage());return null;}}this.gView = view;return bmp;} protected void onPostExecute(Bitmap bm) {if (bm != null) {this.gView.setImageBitmap(bm);this.gView = null;}}}
2、在UI主线程中创建其实例并execute()执行
HotelListData dlData = new HotelListData();HotelListData.Item item = dlData.new Item(); item = (HotelListData.Item) infoVector.getLs().elementAt(position);holder.text0.setText(item.getN()); holder.star.setImageDrawable(getResources().getDrawable(imageIndex[Integer.parseInt(item.getS().toString())])); holder.text2.setText(item.getP());holder.text3.setText(item.getA()); if (item.getI() != null && (!item.getI().equals(""))) {Bitmap bm = returnBitMap(item.getId());if (bm != null) {holder.image.setImageBitmap(bm);} else {if (!holder.image.isDrawingCacheEnabled()|| !holder.image.getTag().equals(item.getI())) {holder.image.setImageResource(R.drawable.img_loading);holder.image.setTag(item);try {new DownImageTask().execute(holder.image);holder.image.setDrawingCacheEnabled(true);} catch (Exception e) {Log.e("error","RejectedExecutionException in content_img: "+ item.getI());}}}}
简要
首先创建了DownImageTask,该类继承实现了AsyncTask的doInBackground()和onPostExecute(),如上面所介绍,当在getView中创建实例并execute()传入需要获取资源地址URL(地址在TAG中)执行异步线程任务后,程序首先调用doInBackground()。
doInBackground()从传入的Image TAG中获取资源的URL地址进行图片的获取,获取完毕Retrun结果给onPostExecute(),onPostExecute()里再去做相应的结果处理。
最后实现效果
(图片是以前上传在eoe的图,被打了水印)
一开始用其他图片代替,我这直接仿照Google Adnroid Market用的灰色小静态图片(当然你也可以用圆的那种等待进度条动态图片,实现方式前面说过,实现onProgressUpdate(Progress…))
获取完毕后刷新替换(用的Wifi,另外截图软件反应慢,截个图真不容易)
总结
最后总结下思路,无外乎就是先用其他静态图片或者动态展示,后台异步获取图片后替换刷新。(另外最好像我一样弄个Catch(缓存)机制,在获取图片后Catch起来,以后获取先检测是否获取过,如果获取过就直接调用显示,检测标识就是上面放在Image TAG里的URL地址,程序关闭时释放Catch,当然你也可以存起来,看你的需求了)
- Android List列表网络资源异步调用
- Android List列表网络资源异步调用
- Android List列表网络资源异步调用
- Android:异步加载网络资源
- android list列表排序
- Android 网络资源
- Android网络资源
- [Information]网络资源列表
- Android:异步调用详解
- android 异步调用
- Android:异步调用详解
- ios 异步后台获取网络资源
- Android File List 文件列表
- Android列表视图(List View)
- Android列表视图(List View)
- Android UI线程异步调用
- Android 异步链式调用设计
- Android 异步链式调用设计
- 纯C写Windows程序系列---------VS2010设置纯C环境
- 打开/另存为对话框
- poj 1190 生日蛋糕 dfs 剪枝
- POJ 1318
- spring AOP学习总结
- Android List列表网络资源异步调用
- Android List列表网络资源异步调用
- XML的基本语法
- ubuntu 图形界面与字符界面 切换
- 淘宝店铺人气提升工具
- 关于优化需要永远牢记的原则
- 11 个高效的同行代码评审最佳实践(转载)
- atoi,atol,strtod,strtol,strtoul实现类型转
- 各种ubuntu基本软件安装贴links