一、volley是什么?

1、简单介绍

  Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。从名字由来和配图中无数急促的火箭能够看出 Volley 的特点:特别适合数据量小。通信频繁的网络操作。(个人觉得 Android 应用中绝大多数的网络操作都属于这样的类型)。

  Volley载入图片实现了两级缓存(网络缓存、文件缓存)。没有实现内存的缓存。Volley已经把各种异步任务、图片採样都封装好了。内存缓存使用lrucache类实现。须要我们手动增加进去。

没有使用软引用缓存。由于4.0之后的android系统已经不推荐使用软引用缓存了。

2、volley的整体设计

3、volley能够做什么

JSON,图像等的异步下载;

处理get、post等网络请求;

网络请求的排序(scheduling);

网络请求的优先级处理;

缓存;

多级别取消请求;

和Activity和生命周期的联动(Activity结束时同一时候取消全部网络请求);

等等。

它的设计目标就是很适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作。比方说下载文件等,Volley的表现就会很糟糕。

二、图片的三级缓存在volley中的实现

  事实上volley能够全然代替我们手写的三级缓存,由于google已经对volley进行了很好的封装,详细说明例如以下:

1、volley的推荐使用方法-单例模式

  使用volley时,我们推荐把volley的使用封装成单例使用。在application中初始化它。详细代码例如以下:

单例:

package com.ht.xiangqu.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache; import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley; /**
* Created by annuo on 2015/6/16.
*/
public class RequestManager {
private static RequestManager ourInstance;
private RequestQueue requestQueue;
private ImageLoader imageLoader; public static RequestManager createInstance(Context context) {
if (context != null) {
if (ourInstance == null) {
ourInstance = new RequestManager(context);
} else {
throw new IllegalArgumentException("Context must be set");
}
}
return ourInstance;
} public static RequestManager getInstance() {
return ourInstance;
} private RequestManager(Context context) {
requestQueue = Volley.newRequestQueue(context);
imageLoader = new ImageLoader(
requestQueue,
new ImageLoader.ImageCache() {
private LruCache<String, Bitmap> cache
= new LruCache<>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
} @Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
}
);
} public RequestQueue getRequestQueue() {
return requestQueue;
} public ImageLoader getImageLoader() {
return imageLoader;
} }

application:

package com.ht.xiangqu.util;

import android.app.Application;
import android.util.Log; /**
* Created by annuo on 2015/6/16.
*/
public class MainApplation extends Application {
@Override
public void onCreate() {
super.onCreate();
RequestManager.createInstance(getApplicationContext());
Log.d("nihao", "nihao");
}
}

2、内存缓存

  仅仅有载入图片的时候才会有内存缓存,对于字符串一般都是之后文件缓存。

  google并没有自己主动的帮我们实现内存的缓存,须要我们自己手动增加进去。内存缓存在单例类中已经体现了(即LruCache),以后我们每次使用的时候都不必再增加内存缓存。LruCache这个类是Android3.1版本号中提供的。假设你是在更早的Android版本号中开发,则须要导入android-support-v4的jar包。

3、文件缓存

  volley已经默认帮我们实现了文件的缓存。

我们通过源码看一下:

    /**
* Constructs a new ImageLoader.
* @param queue The RequestQueue to use for making image requests.
* @param imageCache The cache to use as an L1 cache.
*/
public ImageLoader(RequestQueue queue, ImageCache imageCache) {
mRequestQueue = queue;
mCache = imageCache;
}

  以上代码是imageloader中的一段代码,从中我们能够看到在构造imageloader时,我们已经默认的建立了一个L1级的缓存(文件缓存)。

那volley缓存下来的文件究竟在哪呢?见下图:

  详细的位置就在如图所看到的的位置。即data/data/应用程序的包名/volley。假设没有改动volley的缓存位置。默认名字叫volley。

4、图片的二次採样的问题

  事实上volley默认的已经帮我们做了图片的二次採样,仅仅是须要我们在进行请求的时候,多增加两个參数。我们一般都忽略了这个问题,最后导致的是不断的OOM。

    /**
* 这是訪问网络图片的核心方法
* @param requestUrl
* @param imageListener
* @param maxWidth
* @param maxHeight
* @return
*/
public ImageContainer get(String requestUrl, ImageListener imageListener,
int maxWidth, int maxHeight) {
        Request<?

> newRequest =
new ImageRequest(requestUrl, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
onGetImageSuccess(cacheKey, response);
}
}, maxWidth, maxHeight,
Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onGetImageError(cacheKey, error);
}
}); mRequestQueue.add(newRequest);
mInFlightRequests.put(cacheKey,
new BatchedImageRequest(newRequest, imageContainer));
return imageContainer;
}

  以上代码是imageloader的核心方法,当中有两个參数是maxWidth,maxHeight。我们一般都忽略了这两个參数。默认值是0和0,这样二次採样算法就不起作用了。我们得到的图片是从server1:1哪来的。可是一般我们设置了这两个參数。就能够得到我们希望的缩小比例的图片。这样就能够全然的避免OOM。

三、volley的其它问题

1、圆角图片的问题

    public static ImageListener getImageListener(final ImageView view,
final int defaultImageResId, final int errorImageResId) {
return new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
} @Override
public void onResponse(ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
//在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个
//额外的參数
view.setImageBitmap(response.getBitmap());
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
}
};
}

2、listview复用时,解决图片错位的问题

    /**
* 使用此方法能够解决图片错乱问题
* @param view
* @param defaultImageResId
* @param errorImageResId
* @param url
* @return
*/
public static ImageListener getImageListener(
final ImageView view,
final int defaultImageResId,
final int errorImageResId,
final String url) {
return new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
} @Override
public void onResponse(ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
//在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个
//额外的參数
String urlTag = (String) view.getTag();
if(urlTag!=null && urlTag.trim().equals(url)){
view.setImageBitmap(response.getBitmap());
}
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
}
};
}

四、volley的详细使用方法

  关于这块内容。网络上有许多的资料,总之volley使用起来很的简单。感兴趣的能够去网络上查找相关的资料进行学习。volley的载入速度绝对出乎你的意料。

——知道自己是谁。要什么。能跳多高。并且敢跳,并承受跳了可能失败的全部结果。

volley全然解析的更多相关文章

  1. Android Volley全然解析(四),带你从源代码的角度理解Volley

    版权声明:本文出自郭霖的博客,转载必须注明出处. https://blog.csdn.net/sinyu890807/article/details/17656437 转载请注明出处:http://b ...

  2. [转] Android Volley完全解析(一),初识Volley的基本用法

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法   转载请注明出处:http ...

  3. Android Volley完全解析

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  4. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  5. [转]Android Volley完全解析(四),带你从源码的角度理解Volley

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是 ...

  6. Android 属性动画(Property Animation) 全然解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  7. Android 开源框架Universal-Image-Loader全然解析(二)--- 图片缓存策略具体解释

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...

  8. Android ActionBar全然解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc.我翻译之后又做了些加工 ...

  9. Android ListView工作原理全然解析,带你从源代码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android全部经常使用的原生控件其中.使用方法最复杂的应该就是 ...

随机推荐

  1. Tiny4412在Ubuntu下给MiniTools添加快捷方式

    解压MiniTools-Linux-20140317.tgz root@ubuntu:~/tiny4412/MiniTools-# ls -l total -rw-r--r-- root root M ...

  2. 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。

    使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...

  3. CENTOS设置MYSQL字符集

    CENTOS设置MYSQL字符集 show variables like 'character_set%'; vim etc/my.cnf 修改成如下: [client] port=3306 sock ...

  4. appium_v1.4.16版本自动化适配android7.0系统

    https://www.cnblogs.com/imlvbu/p/7127940.html 要解决的问题:appium在androidV7.0系统上运行时报错 Failure [INSTALL_FAI ...

  5. ADOX创建ACCESS数据库列名的数据类型

    Type   属性             指示   Parameter.Field   或   Property   对象的操作类型或数据类型. 设置和返回值 设置或返回下列   DataTypeE ...

  6. “/”和“\\”和feof();

    filename=c:/test/abc.text filename=c:\\test\\abc.test "\\"为转义字符: feof();函数检测文件是否已经到达末尾(EOF ...

  7. python 常用的模块(base64)转

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  8. Spark map-side-join 关联优化

    在spark中要进行join操作,如果在shuffle的时候进行join效率较低.如果满足 所需要join的表中有一张表较小,那么可以考虑在map端进行join操作. 转载:http://blog.c ...

  9. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...

  10. asp.net原理笔记----页面控件类型,页面状况和asp.net编译过程

    通过查看asp.net的整个生命周期之后 了解到在aspx的页面生命周期中 调用了BuildControlTree()方法生成页面控件树 之后再调用Rend()方法根据控件树生成html返回 aspx ...