Volley网络框架完全解析(实战篇)
来源:互联网 发布:气动打标机软件下载 编辑:程序博客网 时间:2024/06/04 18:49
好了,今天就通过一个瀑布流demo,来使用Volley框架请求网络图片。
前言:
我们使用NetworkImageView显示图片:
1、因为该控件可以自动的管理好请求的生命周期,当与父控件detach或者它移出屏幕时可以自动取消网络请求
2、该控件会根据我们所设置的NetworkImageView宽高来进行图片的压缩
3、该控件可以设置默认状态下显示的图片,可以设置在请求失败时候显示的图片
还用了ImageLoader来加载图片,使用ImageCache缓存来防止程序OOM,由于Volley自动会处理硬盘缓存,所以在没网情况下它还是能正常显示图片
好了,我先来看看效果吧:
由于gif上传大小限制,我就录了前一部分,我们从这部分的效果就可以看出,在加载图片时候,默认时会先显示我们设置的默认的图片,然后通过网络加载,再显示加载到的图片,因为ImageCache自动管理了内存缓存、而NetworkImageView又自动会根据它自身的宽高来压缩图片,所以即使图片数量多、图片大小比较大也可以很好的避免OOM。
下面我们打开缓存目录来看下缓存的文件:
现在我们把网络断开,来看看效果:
可以看到,在没有网络状态下,还是可以加载出图片,因为它会从缓存中取,即:
在没有网络的条件下会自动从缓存中取数据,在有网络的状态下,会先判断缓存中有没有该缓存文件,如有则取出,没有则开启网络请求获取,再存入硬盘缓存中。
好了,代码就贴个主要的:
RecyclerView适配器:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> { private Context mContext; private List<String> datas; private ImageLoader mImageLoader; private BitmapCache mBitmapCache; private List<Integer> heights; public RecyclerAdapter(Context context, List<String> datas) { this.mContext = context; this.datas = datas; getRandomHeights(); mBitmapCache = new BitmapCache(); mImageLoader = new ImageLoader(MyApplication.getRequestQueue(), mBitmapCache); } private void getRandomHeights() { heights = new ArrayList<>(); for (int i = 0; i < datas.size(); i++) { heights.add((int) (300 + Math.random() * 200)); } } @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, parent, false); RecyclerViewHolder holder = new RecyclerViewHolder(view); return holder; } @Override public void onBindViewHolder(RecyclerViewHolder holder, int position) { ViewGroup.LayoutParams params = holder.itemView.getLayoutParams(); params.height = heights.get(position); holder.itemView.setLayoutParams(params); holder.mNetworkImageView.setDefaultImageResId(R.mipmap.ic_crop_original_black_48dp); holder.mNetworkImageView.setErrorImageResId(R.mipmap.ic_filter_hdr_black_48dp); holder.mNetworkImageView.setImageUrl(datas.get(position), mImageLoader); } @Override public int getItemCount() { return datas.size(); }}
BitmapCache代码:
public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String,Bitmap> mLruCache; public BitmapCache(){ int maxMemory = (int) Runtime.getRuntime().maxMemory(); int maxCacheSize = maxMemory/8; mLruCache = new LruCache<String,Bitmap>(maxCacheSize){ @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; } @Override public Bitmap getBitmap(String s) { return mLruCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { mLruCache.put(s,bitmap); }}
demo下载地址请戳
1 0
- Volley网络框架完全解析(实战篇)
- Volley网络框架完全解析(使用篇)
- Volley网络框架完全解析(缓存篇)
- Volley网络框架完全解析(使用篇)
- Volley网络框架完全解析(缓存篇)
- Android 网络通信框架Volley完全解析(一)
- Android网络框架Volley(实战篇)
- Android网络框架Volley(实战篇)
- Android网络框架Volley(实战篇)
- Android网络框架Volley(实战篇)
- volley 网络框架解析
- volley网络框架解析
- ym—— Android网络框架Volley(实战篇)
- Android Volley框架完全解析,灰常好用
- (转)ym—— Android网络框架Volley(实战篇)
- Android Volley完全解析(二) , 使用Volley加载网络图片
- Android Volley完全解析(二),使用Volley加载网络图片
- Android Volley完全解析(二),使用Volley加载网络图片
- PAT 1036. Boys vs Girls (25)
- iOS_第三方字体的导入和使用
- 数据结构概述
- 红拂夜奔
- 交换两个值的方法
- Volley网络框架完全解析(实战篇)
- Openerp权限设置总结
- 邮差总按两次铃
- 解决eclipse不能
- Eclipse- c++ 代码提示功能
- GroovySql 的 API
- 数据结构 多线程安全队列基于数组实现
- 浅谈CSRF攻击方式
- HDU 2825 Wireless Password (AC自动机 + 状态压缩DP)