Android-使用Volley 连接网络
2015-11-19 22:54
926 查看
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:
Android官方文档推荐用一个单独的类来管理RequestQueue:
3)选择Request:
Volley内置的Request有:StringRequest、JsonRequest、ImageRequest,下载网络图片,还可以使用ImageLoader,当然还可以自定义Request,这个可以直接参考Volley内置的几个Request, 这里自定义了一个GsonRequest,实现Request以后,将request加入到RequestQueue,这样就算完成了一次简单的Volley使用。相关代码如下:
测试代码:源码链接: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
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
相关文章推荐
- ajax基础(1)
- HttpURLConnection与HttpClient的Get与Post请求数据流程
- DHCP原理及配置
- http://runjs.cn/
- 网络编程-阻塞非阻塞同步异步
- hihocoder 1252 Kejin Game dinic网络流
- 安装LNMP可能遇到的问题及解决方法
- QT使用QTcpSocket和QTcpServer通信是出现乱码的问题
- 神经网络BP算法代码java版
- 9. Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)
- Qt5网络与通信
- 网络流
- HTTP协议学习(四)——Web服务器
- Linux 线程绑核 http://www.cnblogs.com/dongzhiquan/archive/2012/02/15/2353215.html
- HTTP协议学习(三)——连接管理
- AFNetworking用法及网络监测
- windows下重新安装TCP/IP协议栈
- 线程堆栈大小 pthread_attr_setstacksize 的使用【转】 http://www.cnblogs.com/qq78292959/archive/2012/03/29/2423821
- HTTP协议学习(二)——响应状态码及其含义
- HTTP协议学习(一)——URL与资源,报文结构详解