原文链接:Setting Up a RequestQueue
这节课教你:
- 建立一个Network和Cache
- 使用单例模式
先前的教程教你如何使用Volley.newRequestQueue
这个便捷的方法类建立一个RequestQueue
,使用Volley的默认行为(译注:默认值)。这节课带你通过明确的步骤来创建一个RequestQueue
,你可以使用自定义的行为(译注:自定义值)。
这节课还要阐述创建一个RequestQueue
的推荐实践,就是单例,它使得RequestQueue
与app的生命周期相伴。
建立一个Network和Cache
RequestQueue
需要两个东西才能工作:一个是network来完成request的传输,另一个是cache来处理缓存。在Volley的工具箱中对这些有标准的实现:DiskBasedCache
提供了每个响应一个文件的缓存,使用内存中索引,BasicNetwork
提供了一个基于你优选的HTTP客户端的网络传输。
BasicNetwork
是Volley的默认网络实现。BasicNetwork
必须被你的app连接网络所使用的HTTP客户端初始化。典型情况是HttpURLConnection
下面的代码片段展示了建立一个RequestQueue
需要的步骤:
// 使用 cache 和 network初始化 RequestQueue
mRequestQueue = new RequestQueue(cache, network);
// 启动队列
mRequestQueue.start();
String url ="http://www.example.com";
// 明确描述请求(request)并处理响应(response)
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 处理响应信息
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Handle error
}
});
// 添加request 到 RequestQueue.
mRequestQueue.add(stringRequest);
// ...
如果你只是产生一次性的request而不想留下线程池,你可以使用Sending a Simple Request中描述的Volley.newRequestQueue()
在任何你需要的地方创建RequestQueue
,然后一旦响应或错误返回了,在RequestQueue
调用stop()
。但是更普遍的用法是使用单例创建RequestQueue
,让RequestQueue
伴随着app的生命周期一直运行,这个在下一个部分讨论。
使用单例模式
如果你的应用需要经常使用网络,那么创建单例的RequestQueue
会更高效。你可以通过多种方式实现。推荐的方式是实现一个单例类来封装RequestQueue
和其它的Volley有的功能。另一种方式是继承Application
并在Application.onCreate()
方法中构建RequestQueue
。但是我们不鼓励这样做。一个静态的单例能够更加模块化地提供相同的功能。
关键的是RequestQueue
必须用Application
的context来初始化,而不是Activity
的context。这样才能保证RequestQueue
能够伴随着应用的生命周期存在,而不是随着activity的每次重建而重建(比如,当用户旋转设备)。
下面是一个单例类的例子,提供了RequestQueue
和ImageLoader
的功能:
public class MySingleton {
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;
private MySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized MySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new MySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext() 是关键, 它避免了你
//传递进Activity或BroadcastReceiver导致的内存泄漏
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return mImageLoader;
}
}
下面是使用单例类来执行RequestQueue
操作的例子:
// 获取一个RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
getRequestQueue();
// ...
// 添加一个request (示例中为 stringRequest) 到RequestQueue中
MySingleton.getInstance(this).addToRequestQueue(stringRequest);
项目源码下载 :点击下载
系列索引
- 【译】Volley官方文档五:实现一个自定义的Request
- 【译】Volley官方文档四:构建一个标准的Request
- 【译】Volley官方文档三:建立一个RequestQueue
- 【译】Volley官方文档二:发送一个简单的request
- 【译】Volley官方文档一:使用Volley传递网络数据
更新日志 ↓ ↓ ↓
- 2016年03月21日:添加了系列索引
- 2016年03月20日
- 翻译了代码中的英文
- 添加了源码