Volley的初使用

作者: shb1994 | 来源:发表于2017-02-21 16:09 被阅读0次

    Volley的使用

    • 首先得到Volley的源码,但是需要自己换时间去弄成jar包,或者使用AS的就作为依赖,所以我直接上我githup链接:

    https://github.com/shenahobo/TestVolley 里面libs种有个jar包.直接去clone下来就好啦.

    • 看这个文章你能知道那些?
      • 1.Volley基本概念.
      • 2.各种Request(请求)的简单使用.
      • 3.怎么取消Request(请求).
      • 4.写出请求队列的单例模式.
      • 5.设置连接的超时时间.
      • 6.具体详情请看githup.

    Volley简介

    首先Volley是谷歌推出的,其底层是基于HttpUrlConnection 和 apche的httpClient ,其中sdk大于9(也就是2.2) 使用HttpUrlConnection,小于9 的
    时候使用apche的HttpClient ,因为HttpUrlConnection是一个轻量级的,google对其做了许多的优化,且在android2.2 之前有一个重大的bugd调用close()函数会影响连接池,会导致链接复用失效.而HttpClient 则是一个成熟的框架,体量相对大一些,多用于Web,并且在android6.0去除了HttpClient.

    各种Request(请求)的简单使用.

    • StringRequest请求中Get请求
      • 1.先创建 RequestQueue 队列.

                  RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
        
      • 2.创建StringRequest对象.

              StringRequest stringRequest = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    Log.i(TAG, "ThreadName: " + Thread.currentThread().getName());
                    Log.i(TAG, "onResponse: s====" + s);
                    /*Message msg = Message.obtain();
                    msg.what = SUCCESSFUL;
                    msg.obj = s;
                    mHandler.sendMessage(msg);*/
                    tvShow.setText(s);
                  }
                }, new Response.ErrorListener() {
                  @Override
                  public void onErrorResponse(VolleyError volleyError) {
                    Log.i(TAG, "onResponse: s====" + volleyError.getMessage());
                  }
                });
        
      • 3.将StringRequest添加到队列中.

              mQueue.add(stringRequest);
        
    • StringRequest中Post请求
      • 同样的步骤,只是第2步不一样,而已.

      • 1.创建stringRequest对象,重写StringRequest中的getParams方法,在map集合中添加键值对.

              StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
              @Override  
              protected Map<String, String> getParams() throws AuthFailureError {  
                  Map<String, String> map = new HashMap<String, String>();  
                  map.put("params1", "value1");  
                  map.put("params2", "value2");  
                  return map;  
              }  
          };  
        
      • 2.添加到队列中.

          mQueue.add(stringRequest);
        
    • JsonRequest的用法.
      • 1.需要注意的是:JsonRequest有两个子类,一个JsonObjectRequest, JsonArrayRequest两个类.

              JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, GETURL, null, new Response.Listener<JSONObject>() {
                          @Override
                          public void onResponse(JSONObject jsonObject) {
                              tvShowTwo.setText(jsonObject.toString());
                          }
                      }, new Response.ErrorListener() {
                          @Override
                          public void onErrorResponse(VolleyError volleyError) {
                              tvShowTwo.setText(volleyError.getMessage());
                          }
                      });
        
      • 2.添加到队列中.

             mQueue.add(stringRequest);  
        
    • 图片的就不贴代码了,需要的直接去 https://github.com/shenahobo/TestVolley

    请求的取消.

    • Volley请求的的取消.
      • 1.取消单个,直接用请求对象调用cancle()方法.

              stringRequest.cancle();
        
      • 2.取消全部 返回true 取消全部.

              mRequestQueue.cancelAll(new RequestQueue.RequestFilter()
              {
                  rrturn true ;});
        
      • 3.取消设置了TAG(标识)的请求

              mRequestQueue.cancelAll(TAG);//取消tag为TAG的的请求.
        

    设置请求的超时时间.

          //3,设置超时时间 参数含义:超时时间  重试次数  超时时间因子
          mStringRequest.setRetryPolicy(new DefaultRetryPolicy(500, 1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    

    请求队列的单例模式.

    public class MyApplication extends Application {
    private RequestQueue mRequestQueue;
    private static volatile MyApplication mInstance;
    
    @Override
    public void onCreate() {
        super.onCreate();
        //得到MyApplication 的对象.
        mInstance = this;
        if (mRequestQueue == null) {
            synchronized (MyApplication.class) {
                if (mRequestQueue == null) {
                    mRequestQueue = Volley.newRequestQueue(getApplicationContext());
                }
            }
        }
    }
    
    public static synchronized MyApplication getInstance() {
        return mInstance;
    }
    
    /**
     * 得到请求队列
     *
     * @return 返回请求队列
     */
    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }
    
    /**
     * 添加到请求队列
     *
     * @param req 请求
     * @param TAG 标识
     * @param <T>
     */
    public <T> void addRequest(Request<T> req, Object TAG) {
        if (req != null) {
            req.setTag(TAG);
            getRequestQueue().add(req);
        }
    }
    
    public <T> void add(Request<T> req) {
        if (req != null) {
            getRequestQueue().add(req);
        }
    }
    
    /**
     * 取消所有请求
     *
     * @param TAG 标识
     * @param <T>
     */
    public <T> void cancelRequest(Object TAG) {
        getRequestQueue().cancelAll(TAG);
    }
    
    /**
     * 取消单个请求
     *
     * @param req
     * @param <T>
     */
    public <T> void cancle(Request<T> req) {
        if (req != null) {
            req.cancel();
        }
    }
    

    }

    最后 需要注意的地方.

    • 所对应的回调,通过打Log发现是在主线程中的, 所以可以直接在里面更新UI.
    • 使用的时候需要添加联网的权限.
    • 创建的Applcation类需要在清单文件中进行配置.
    • 取消请求的时候,Request对象还没有创建,需要进行非空判断,防止空指针.
    • 当取消请求的时候,onResponse和onErrorResponse方法将不会执行.

    相关文章

      网友评论

        本文标题:Volley的初使用

        本文链接:https://www.haomeiwen.com/subject/tljuwttx.html