volley开源库的学习

1、Volley是一个HTTP库,它能够帮助Android apps更方便的执行网络操作,最重要的是它更快速高效。

2、Volley获取:https://android.googlesource.com/platform/frameworks/volley

3、Volley 有如下的优点:
自动调度网络请求。
高并发网络连接。
通过标准的HTTP的cache coherence(高速缓存一致性)使得磁盘与内存缓存不可见(Transparent)。
支持指定请求的优先级。
支持取消已经发出的请求。你可以取消单个请求,或者指定取消请求队列中的一个区域。
框架容易被定制,例如,定制重试或者回退功能。
强大的指令(Strong ordering)可以使得异步加载网络数据并显示到UI的操作更加简单。
包含了Debugging与tracing工具。

4、Volley不适合用来下载大的数据文件。因为Volley会在解析的过程中保留持有所有的响应数据在内存中。对于下载大量的数据操作,请考虑使用DownloadManager。


Example1:发送简单的网络请求

mText = (TextView)findViewById(R.id.text);
        RequestQueue queue = Volley.newRequestQueue(this);
        String url = "http://www.baidu.com";
        //Request a string response from the provided URL
        StringRequest stringRequest = new StringRequest(Request.Method.GET,url,
                new Response.Listener(){
                    @Override
                    public void onResponse(Object response) {
                        mText.setText("Response is: "+((String)response).substring(0,500));
                    }
                },new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError error) {
                mText.setText("it does not work!");
            }
        });
        //Add the request to the RequestQueue
        queue.add(stringRequest);

分析:

一、RequestQueue管理用来执行网络操作的工作线程,从Cache中读写数据,并解析Http的响应内容。 Requests 执行raw responses的解析,Volley会把响应的数据分发给主线程

二、为了发送一个请求,只需要构造一个请求并通过add()方法添加到 RequestQueue中。一旦添加了这个请求,它会通过队列,得到处理,然后得到原始的响应数据并返回。
三、当执行add()方法时,Volley触发执行一个缓存处理线程以及一系列网络处理线程。当添加一个请求到队列中,它将被缓存线程所捕获并触发:如果这个请求可以被缓存处理,那么会在缓存线程中执行响应数据的解析并返回到主线程。如果请求不能被缓存所处理,它会被放到网络队列中。网络线程池中的第一个可用的网络线程会从队列中获取到这个请求并执行HTTP操作,解析工作线程的响应数据,把数据写到缓存中并把解析之后的数据返回到主线程。

四、可在任何线程中添加一个请求,但是响应结果都是返回到主线程的。

下图,演示了一个请求的生命周期:



Example2:cancel a request

1、对请求Request对象调用 cancel() 方法取消一个请求。一旦取消,Volley会确保你的响应Handler不会被执行。这意味着在实 际操作中你可以在activity的 onStop() 方法中取消所有pending在队列中的请求。你不需要通过检测 getActivity() == null 丢弃你的响应handler,其他类似 onSaveInstanceState() 等保护性的方法里面也都不需要检测。
2、为了利用这种优势,你应该跟踪所有已经发送的请求,以便在需要的时候可以取消他们。有一个简便的方法:你可以为每一个请求对象都绑定一个tag对象。然后你可以使用这个tag来提供取消的范围。例如,你可以为你的所有请求都绑定到执行的Activity上,然后你可以在 onStop()方法执行requestQueue.cancelAll(this)。

1 、定义你的tag并添加到你的请求任务中。
   
public static final String TAG = "MyTag";
    StringRequest stringRequest;
    RequestQueue mRequestQueue;
    // Set the tag on the request.
    stringRequest.setTag(TAG);
    // Add the request to the RequestQueue.
    mRequestQueue.add(stringRequest);
2、在activity的onStop()方法里面,取消所有的包含这个tag的请求任务。
    @Override
    protected void onStop(){
        super.onStop();
        if(mRequestQueue != null){
            mRequestQueue.cancelAll(TAG);
        }
    }
当取消请求时请注意:如果你依赖你的响应handler来标记状态或者触发另外一个进程,你需要对此进行考虑。再说一次,response handler是不会被执行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值