Android Volley 框架

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<JsonObject>(){
       @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<String> listener, Response.ErrorListener errorListener) {        
        super(method, url, listener, errorListener);    
    }    
    public MyStringRequest(String url, Response.Listener<String> 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<T extends BasePresenter> implements Response.Listener, Response.ErrorListener {    
    private WeakReference<Response.Listener> listenerRef;    
    private WeakReference<Response.ErrorListener> 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值