Volley是Goole在2013年Google I/O大会上推出了一个新的网络通讯框架,它是开源的。从名字由来和配图中无数急促的火箭可以看出 Volley 的特色:特别适合数据量小。通讯频繁的网络操做。(我的以为 Android 应用中绝大多数的网络操做都属于这样的类型)。java
Volley载入图片实现了两级缓存(网络缓存、文件缓存)。没有实现内存的缓存。Volley已经把各类异步任务、图片採样都封装好了。内存缓存使用lrucache类实现。需要咱们手动增长进去。android
没有使用软引用缓存。因为4.0以后的android系统已经不推荐使用软引用缓存了。算法
JSON,图像等的异步下载;
处理get、post等网络请求;
网络请求的排序(scheduling);
网络请求的优先级处理;
缓存;
多级别取消请求;
和Activity和生命周期的联动(Activity结束时同一时候取消所有网络请求);
等等。缓存
它的设计目标就是很适合去进行数据量不大,但通讯频繁的网络操做,而对于大数据量的网络操做。比方说下载文件等,Volley的表现就会很糟糕。markdown
事实上volley可以全然代替咱们手写的三级缓存,因为google已经对volley进行了很好的封装,详细说明例如如下:网络
使用volley时,咱们推荐把volley的使用封装成单例使用。在application中初始化它。详细代码例如如下:app
单例:框架
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");
}
}
仅仅有载入图片的时候才会有内存缓存,对于字符串通常都是以后文件缓存。ide
google并无本身主动的帮咱们实现内存的缓存,需要咱们本身手动增长进去。内存缓存在单例类中已经体现了(即LruCache),之后咱们每次使用的时候都没必要再增长内存缓存。LruCache这个类是Android3.1版本号中提供的。假设你是在更早的Android版本号中开发,则需要导入android-support-v4的jar包。
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。
事实上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。
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);
}
}
};
}
/** * 使用此方法可以解决图片错乱问题 * @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的载入速度绝对出乎你的意料。
——知道本身是谁。要什么。能跳多高。而且敢跳,并承受跳了可能失败的所有结果。