精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-22
浅谈Android ListView 异步图片获取
Android应用中,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,而且如果加载在图片比较多的View中,如ListView GridView WebView中,加载速度会比较缓慢。Android中图片加载速度很慢的话,程序很容易就挂掉,等待的用户用户同样会等到崩溃。
我们一般的处理方法是:
异步下载
本地缓存
----------------------------------------------------------- 先说异步下载
如一个ListView的异步下载
它的Adapter是
public class InsuranceItemAdapter extends BaseAdapter{ private ArrayList<data> mList; private Context mContext; // 异步加载图片的线程 private AsyncImageLoader imageLoader = new AsyncImageLoader(); //当前的缓存 private Map<Integer, View> viewMap = new HashMap<Integer, View>(); public InsuranceItemAdapter(Context context, ArrayList<data> ins) { mContext = context; mList= ins; } public InsuranceItemAdapter(Context context, ArrayList<data> ins, Handler handler) { mContext = context; mList= ins; } public void setInsurance(ArrayList<data> ins) { mList= ins; } public int getCount() { return mList.size(); } public Object getItem(int position) { try { return mList.get(position); } catch (Exception ex) { return null; } } public long getItemId(int position) { return position; } private View newView() { ItemView view = new ItemView(mContext); return view; } public View getView(int position, View convertView, ViewGroup parent) { //先从缓存里面读取 ViewHolder holder = null; View view; if (viewMap.get(position) == null) { view = newView(); holder = new ViewHolder(); holder.mTitle = (TextView)view.findViewById(R.id.ins_title); holder.mTime = (TextView)view.findViewById(R.id.ins_time); holder.mType = (TextView)view.findViewById(R.id.ins_from); holder.mPic = (ImageView)view.findViewById(R.id.ins_small_pic); final int p = position; viewMap.put(position, view); view.setTag(holder); }else{ Log.e("MainActivity","position2 = "+position); view = viewMap.get(position); holder = (ViewHolder)view.getTag(); } data ins = mList.get(position); holder.mTitle.setText(ins.getTitle()); holder.mPic.setVisibility(View.VISIBLE); // 异步加载图片 Drawable cachedImage = imageLoader.loadDrawable(ins.getPic(), holder.mPic, new ImageCallback() { public void imageLoaded(Drawable imageDrawable, ImageView imageView, String imageUrl) { imageView.setImageDrawable(imageDrawable); } }); if (cachedImage != null) { holder.mPic.setImageDrawable(cachedImage); } return view; } static class ViewHolder{ ImageView mPic; TextView mTitle; TextView mTime; TextView mType; } }
原理简单,不罗嗦了
本地缓存 就是先读取本地的数据,如果本地没有再从网络上获取 WebView中很简单,
就能实现了。 其他地方我们就得自己写一个异步图片下载了, 当然我们也可以存数据库中,从数据库中优先获取,当没有网络的时候达到离线阅读的功能。
<!--EndFragment--> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-22
没什么技术含量,属于重复帖
|
|
返回顶楼 | |
发表时间:2012-02-25
确实,抄来抄去的,根本没深入研究。
|
|
返回顶楼 | |
发表时间:2012-02-29
难道比原文的代码更精简吗?
|
|
返回顶楼 | |
浏览 5964 次