Android-使用Volley 连接网络

来源:互联网 发布:sql语句删除列 编辑:程序博客网 时间:2024/05/17 23:53
   Volley是Android开源的一个框架,于2013年在Google大会上发布。    
   Volley是一个Http库,它让Android Apps执行网络操作更加方便,并且更加高效。在Android 开源项目仓库中可以获得Volley源码:    
      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)多并发网络连接(犹如多支箭被弓射出);
   3)使用标准的Http cache coherence(高速缓存一致性)让磁盘和内存响应缓存不可见;
   4)支持请求的优先级;
   5)支持取消请求API:你可以取消一个单独的请求,也可以设置取消请求模块或者范围。
   6)易于定制,比如重试和回退功能。    
   7)强大的排序(Strong ordering),可以很容易正确的填充异步从网络获取的数据到用户界面。
   8)调试和跟踪工具。
   Volley擅长用于填充UI RPC式的操作,如获取搜索结果的页面结构化数据,它与任何协议都可以轻易集成,并输出可以直接使用的原始数据,如String、Image和Json。
Volley为你需要的功能提供内置支持,使得你可以不用去写样板的代码,而让你专注于你的app特定的程序逻辑上。
   Volley不适合大数据的下载,或者流传输的操作,因为在解析过程中Volley在内存中持有所有的响应。要执行大数据下载的操作,可以考虑DownLoadManager。
   
   Volley的简单使用:
   1)准备Volley:
     要让应用程序使用Volley,就要把Volley的代码或者lib增加到工程中,我是将源代码直接放进工程中,这样方便阅读源码:
       
   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:
    Volley内置的Request有:StringRequest、JsonRequest、ImageRequest,下载网络图片,还可以使用ImageLoader,当然还可以自定义Request,这个可以直接参考Volley内置的几个Request, 这里自定义了一个GsonRequest,实现Request以后,将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));
}
}
}
 

测试代码:源码链接:http://pan.baidu.com/s/1iEZuQ 密码:1jdq (VolleyNetWork.zip)
 
参考文档:http://developer.android.com/training/volley/index.html
          http://developer.android.com/training/volley/simple.html
          http://developer.android.com/training/volley/requestqueue.html
          http://developer.android.com/training/volley/request.html
          http://developer.android.com/training/volley/request-custom.html
1 0