Volley是Android开源的一个框架,于2013年在Google大会上发布。    


    


        git clone https : //android.googlesource.com/platform/frameworks/volley


   当然如果有Android工程源码,可以在源码中找到Volley:./frameworks/volley,甚至在编译整个源码之后能获得volley的jar文件:


    .\out\target\common\obj\JAVA_LIBRARIES\volley_intermediates


   Volley的优点:


   1)自动调度网络请求;


   2)多并发网络连接(犹如多支箭被弓射出);


一致性)让磁盘和内存响应缓存不可见;


   4)支持请求的优先级;


   5)支持取消请求API:你可以取消一个单独的请求,也可以设置取消请求模块或者范围。


   6)易于定制,比如重试和回退功能。    


   7)强大的排序(Strong ordering),可以很容易正确的填充异步从网络获取的数据到用户界面。


   8)调试和跟踪工具。


Volley擅长用于填充UI RPC式的操作,如获取搜索结果的页面结构化数据,它与任何协议都可以轻易集成,并输出可以直接使用的原始数据,如String、Image和Json。


Volley为你需要的功能提供内置支持,使得你可以不用去写样板的代码,而让你专注于你的app特定的程序逻辑上。


Volley在内存中持有所有的响应。要执行大数据下载的操作,可以考虑DownLoadManager。


   


   Volley的简单使用:


   1)准备Volley:


     要让应用程序使用Volley,就要把Volley的代码或者lib增加到工程中,我是将源代码直接放进工程中,这样方便阅读源码:


     

  

android volume调节 android volley_ide


   2)要使用Volley,就要先为程序准备RequestQueue,然后将request添加到RequestQueue的队列当中,如何得到RequestQueue? 通常都是使用下面的方法来获得一个RequestQueue:    


mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());


Android官方文档推荐用一个单独的类来管理RequestQueue:     


public class VolleyRequestMananger {
private static VolleyRequestMananger mIntance;
    private static Context mContext;
    private RequestQueue mRequestQueue;

    public VolleyRequestMananger(Context context){
     mContext = context;
    }
    public static synchronized VolleyRequestMananger getIntance(Context context){
	if (mIntance == null){
		mIntance = new VolleyRequestMananger(context);
	}
	return mIntance;
	}

   public RequestQueue getRequestQueue() {
	if (mRequestQueue == null) {
	    mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
	}
	return mRequestQueue;
      }
   }


  3)选择Request:


RequestQueue,这样就算完成了一次简单的Volley使用。相关代码如下


//上海当天的天气,返回JSON格式数据
private static final String url = "http://www.weather.com.cn/adat/cityinfo/101020100.html";
//要下载的网络图片url
private static final String imageUrl = "http://i.imgur.com/7spzG.png";
private static final String baiduUrl = "https://www.baidu.com";
private static final String baiduimageurl = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";


@Override
public void onClick(View v) {
      switch (v.getId()){
        case R.id.bt:
            sendStringRequest(baiduUrl);
            break;
        case R.id.bt_load_image:
            sendImageRequest(baiduimageurl);
            break;
        case R.id.bt_load_json:
            sendJsonRequset(url);
            break;
        case R.id.bt_load_cache_image:
            sendLoadCacheImage(imageUrl);
            break;
	}
    }

/**
 * 发送StringRequest
 * */
private void sendStringRequest(String url){
     // Request a string response from the provided URL.
     StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
	       @Override
	       public void onResponse(String response) {
                  // Display the first 500 characters of the response string.
		  mTextView.setText("Response is: "+ response.substring(0,500));
	       }
             },
            new Response.ErrorListener() {
		@Override
		public void onErrorResponse(VolleyError error) {
                    showErrorMsg();
		}
             }
         );
	mRequestQueue.add(stringRequest);
 }

/**
 * 发送ImageRequest
 * */
private void sendImageRequest(String url){
    ImageRequest imageRequest = new ImageRequest(url,
            new Response.Listener<Bitmap>() {
		@Override
		public void onResponse(Bitmap response) {
                    Log.i(TAG, "get bitmap or not?");
                    if(response != null){
			mImageView.setImageBitmap(response);
		    }
                }
            }, 150, 170, Bitmap.Config.RGB_565,
            new Response.ErrorListener() {
		@Override
		public void onErrorResponse(VolleyError error) {
                    showErrorMsg();
		}
            });
	   mRequestQueue.add(imageRequest);
  }

/**
 * 发送JsonRequest
 * */
private void sendJsonRequset(String url) {
    JsonObjectRequest jsObjRequest = new JsonObjectRequest
            (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
	       @Override
   	       public void onResponse(JSONObject response) {
		  mTextView.setText(response.toString());
		  Log.i(TAG, "response : " + response.toString());
	       }
            }, new Response.ErrorListener() {
	      @Override
	      public void onErrorResponse(VolleyError error) {
                    showErrorMsg();
	      }
            });
	mRequestQueue.add(jsObjRequest);
  }

/**
 * ImageLoader
 * */
private void sendLoadCacheImage(String url){
	networkImageView.setImageUrl(url, mananger.getImageLoader());
}

/**
 * 显示Response Error信息
* */
private void showErrorMsg(){
    Toast.makeText(getApplicationContext(), "That didn't work!", Toast.LENGTH_LONG).show();
}
package com.conway.volleynetwork;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * Created by conway on 15-11-17.
 */
public class GsonRequest<T> extends Request<T> {

    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Response.Listener<T> listener;

/**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
     public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
			Response.Listener<T> listener, Response.ErrorListener errorListener) {
	    super(Request.Method.GET, url, errorListener);
       	    this.clazz = clazz;
            this.headers = headers;
       	    this.listener = listener;
}

     @Override
     public Map<String, String> getHeaders() throws AuthFailureError {
	 return headers != null ? headers : super.getHeaders();
     }

     @Override
     protected void deliverResponse(T response) {
	listener.onResponse(response);
     }

     @Override
     protected Response<T> parseNetworkResponse(NetworkResponse response) {
     try {
            String json = new String(response.data,HttpHeaderParser.parseCharset(response.headers));
            return Response.success(gson.fromJson(json, clazz),HttpHeaderParser.parseCacheHeaders(response));
      } catch (UnsupportedEncodingException e) {
	    return Response.error(new ParseError(e));
      } catch (JsonSyntaxException e) {
	    return Response.error(new ParseError(e));
      }
    }
}



 (VolleyNetWork.zip)