1、Volley到底有哪些特点呢?
自动调度网络请求
多个并发的网络连接
通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
支持请求优先级
支持取消请求的强大API,可以取消单个请求或多个
易于定制
健壮性:便于正确的更新UI和获取数据
包含调试和追踪工具
2、Volley中的RequestQueue 和 Request
RequestQueue 用来执行请求的请求队列
Request 用来构造一个请求对象
Request对象主要有以下几种类型:
StringRequest 响应的主体为字符串
JsonArrayRequest 发送和接收JSON数组
JsonObjectRequest 发送和接收JSON对象
ImageRequest 发送和接收Image
3、使用
RequestQueue requestQueue = Volley.newRequestQueue(this);
创建一个Request
private final String url="...."
JsonObjectRequest json_req=JsonObjectRequest(url,nul,new Response.Listener(){
@Override
public void onRespanse(JsonObject response){
//自己做的处理
}
},
new ResponseError.Listener(){
@Override
public voidbonResponseError(VollerError error){
//错误处理
}
}
);
requestQueue.add(jsonObjectRequest);
4、解决内存泄漏问题
request持有对Activity的引用,导致Activity的内存泄露
方法来源
两种方法:
1.新建一个自己的Request类
public class MyStringRequest extends StringRequest{
public MyStringRequest(int method, String url, Response.Listener listener, Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}
public MyStringRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) {
super(url, listener, errorListener);
}
@Override
public void cancel(){
super.cancel();
onFinish();
}
}
onFinish函数会把listener直接设为空(onFinish函数为protected,所以只能在子类里调用了),而cancel操作会把errorListener设为空。
2.使用弱引用
现在的项目都是大部分使用的是MVP模式,一般情况下,我们是在Presenter中来实现Response的接口,使用的使用就直接XXXRequest request = new XXXRequest(method,url,this,this);
MyResponseListener:
public class MyResponseListener implements Response.Listener, Response.ErrorListener {
private WeakReference listenerRef;
private WeakReference errorRef;
public MyResponseListener(Response.Listener listener, Response.ErrorListener error) {
listenerRef = new WeakReference<>(listener);
errorRef = new WeakReference<>(error);
}
@Override
public void onErrorResponse(VolleyError error) {
if (errorRef.get()!=null){
errorRef.get().onErrorResponse(error);
}
}
@Override
public void onResponse(Object response) {
if (listenerRef.get()!=null){
listenerRef.get().onResponse(response);
}
}
}
BasePresenter:
这里可以再做一层保护,自定义一个接口,让Presenter来实现这个接口,防止被人直接使用new XXXRequest(method,url,this,this)。
public abstract class BasePresenter implements Response.Listener, Response.ErrorListener {
private MyResponseListener listener;
public BasePresenter() {
initListener();
}
protected void initListener() {
listener = new MyResponseListener(this, this);
}
protected Response.Listener getListener(){
return listener;
}
protected Response.ErrorListener getErrorListener(){
return listener;
}
}