android volley框架

1 Volley发送get请求:

[java] view plaincopy

  1. public void getJson() {
  2. String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456";
  3. mQueue.add(new JsonObjectRequest(Method.GET, url, null,
  4. new Listener<JSONObject>() {
  5. @Override
  6. public void onResponse(JSONObject response) {
  7. Log.e(TAG, "response : " + response.toString());
  8. }
  9. }, new Response.ErrorListener() {
  10. @Override
  11. public void onErrorResponse(VolleyError error) {
  12. String err = error.getMessage();
  13. Log.e(TAG, "err : " + err);
  14. }
  15. }));
  16. }

2 Volley发送post请求:

[java] view plaincopy

  1. public void postJson() {
  2. String url = "http://"+host+":8080/web/json.jsp";
  3. StringRequest postRequest = new StringRequest(
  4. Request.Method.POST,
  5. url,
  6. new Response.Listener<String>() {
  7. @Override
  8. public void onResponse(String response) {
  9. // response
  10. Log.d("Response", response);
  11. }
  12. }, new Response.ErrorListener() {
  13. @Override
  14. public void onErrorResponse(VolleyError error) {
  15. // error
  16. Log.d("Error.Response", error.getMessage());
  17. }
  18. }) {
  19. @Override
  20. protected Map<String, String> getParams() {
  21. Map<String, String> params = new HashMap<String, String>();
  22. params.put("username", "xjs");
  23. params.put("password", "123456");
  24. return params;
  25. }
  26. };
  27. mQueue.add(postRequest);
  28. }

3 Volley获取网络图片:

[java] view plaincopy

  1. public void getImage() {
  2. String imageUrl = "http://"+host+":8080/web/image.jsp";
  3. NetworkImageView view = (NetworkImageView) findViewById(R.id.network_image_view);
  4. view.setDefaultImageResId(android.R.drawable.ic_menu_rotate);
  5. view.setErrorImageResId(android.R.drawable.ic_delete);
  6. view.setImageUrl(imageUrl, new ImageLoader(mQueue, new BitmapLruCache(1024 * 4)));
  7. }

4 Volley发送Https请求,需要修改源码:

[java] view plaincopy

  1. protected HttpURLConnection createConnection(URL url) throws IOException {
  2. if (url.toString().toLowerCase(Locale.CHINA).startsWith("https")) {
  3. HTTPSTrustManager.allowAllSSL();
  4. }
  5. return (HttpURLConnection) url.openConnection();
  6. }
  7. //HTTPSTrustManager.java:
  8. public class HTTPSTrustManager implements X509TrustManager {
  9. private static TrustManager[] trustManagers;
  10. private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
  11. @Override
  12. public void checkClientTrusted(
  13. java.security.cert.X509Certificate[] x509Certificates, String s)
  14. throws java.security.cert.CertificateException {
  15. // To change body of implemented methods use File | Settings | File
  16. // Templates.
  17. }
  18. @Override
  19. public void checkServerTrusted(
  20. java.security.cert.X509Certificate[] x509Certificates, String s)
  21. throws java.security.cert.CertificateException {
  22. // To change body of implemented methods use File | Settings | File
  23. // Templates.
  24. }
  25. public boolean isClientTrusted(X509Certificate[] chain) {
  26. return true;
  27. }
  28. public boolean isServerTrusted(X509Certificate[] chain) {
  29. return true;
  30. }
  31. @Override
  32. public X509Certificate[] getAcceptedIssuers() {
  33. return _AcceptedIssuers;
  34. }
  35. public static void allowAllSSL() {
  36. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  37. @Override
  38. public boolean verify(String arg0, SSLSession arg1) {
  39. // TODO Auto-generated method stub
  40. return true;
  41. }
  42. });
  43. SSLContext context = null;
  44. if (trustManagers == null) {
  45. trustManagers = new TrustManager[] { new HTTPSTrustManager() };
  46. }
  47. try {
  48. context = SSLContext.getInstance("TLS");
  49. context.init(null, trustManagers, new SecureRandom());
  50. } catch (NoSuchAlgorithmException e) {
  51. e.printStackTrace();
  52. } catch (KeyManagementException e) {
  53. e.printStackTrace();
  54. }
  55. HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
  56. }
  57. }

5 Volley获取服务端返回的cookie,需要修改源码:

[java] view plaincopy

  1. @Override
  2. public HttpResponse performRequest(Request<?> request,Map<String, String> additionalHeaders)
  3. throws IOException,AuthFailureError {
  4. for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
  5. if (header.getKey() != null) {
  6. String key = header.getKey();
  7. List<String> values = header.getValue();
  8. if(key.equalsIgnoreCase("set-cookie")){
  9. StringBuilder cookieString = new StringBuilder();
  10. for(String value : values){
  11. cookieString.append(value).append("\n");//用\n作为分隔符,cookie中不应该有回车符号
  12. }
  13. cookieString.deleteCharAt(cookieString.length() - 1);
  14. Header h = new BasicHeader(header.getKey(), cookieString.toString());
  15. response.addHeader(h);
  16. }else{
  17. Header h = new BasicHeader(header.getKey(), values.get(0));
  18. response.addHeader(h);
  19. }
  20. }
  21. }
  22. }
  23. //然后再request中重写parseNetworkResponse():
  24. @Override
  25. protected Response<String> parseNetworkResponse(NetworkResponse response) {
  26. Response<String> superResponse = super.parseNetworkResponse(response);
  27. Map<String, String> responseHeaders = response.headers;
  28. String rawCookies = responseHeaders.get("Set-Cookie");
  29. //服务端返回是 set-cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; Path=/otn BIGipServerotn=2564030730.64545.0000; path=/
  30. String part1 = substring(rawCookies, "", ";");
  31. String part2 = substring(rawCookies, "\n", ";");
  32. //客户端需要的是 cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; BIGipServerotn=2564030730.64545.0000;
  33. cookies = part1 + "; " + part2 + ";";
  34. return superResponse;
  35. }

6 Volley发请求的时候上传cookie,在request中重写getHeaders():

[java] view plaincopy

  1. @Override
  2. public Map<String, String>getHeaders() throws AuthFailureError {
  3. if(cookies!= null && cookies.length() > 0){
  4. HashMap<String,String>         headers = newHashMap<String, String>();
  5. headers.put("Cookie",cookies);
  6. returnheaders;
  7. }
  8. returnsuper.getHeaders();
  9. }

7 Volley自定义request:

[java] view plaincopy

  1. public class ByteArrayRequest extends Request<byte[]>{
  2. private final Listener<byte[]> mListener;
  3. public ByteArrayRequest(int method, String url, Listener<byte[]> listener, ErrorListener errlistener) {
  4. super(method, url, errlistener);
  5. mListener = listener;
  6. }
  7. @Override
  8. protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {
  9. if(response == null){
  10. return null;
  11. }
  12. if(response.statusCode != HttpStatus.SC_OK){
  13. return null;
  14. }
  15. byte[] bytes = response.data;
  16. return Response.success(bytes, null);
  17. }
  18. @Override
  19. protected void deliverResponse(byte[] response) {
  20. if(mListener != null){
  21. mListener.onResponse(response);
  22. }
  23. }
  24. }

8 Volley设置请求超时时间:

[java] view plaincopy

  1. @Override
  2. public RetryPolicy getRetryPolicy() {
  3. RetryPolicyretryPolicy = new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
  4. returnretryPolicy;
  5. }

如果是用这种方式上传post参数:

[java] view plaincopy

  1. public void postJson() {
  2. String url = "http://"+host+":8080/web/json.jsp";
  3. HashMap<String, String> params = new HashMap<String, String>();
  4. params.put("username", "xjs");
  5. params.put("password", "123456");
  6. JsonObjectRequest postRequest = new JsonObjectRequest(
  7. Request.Method.POST,
  8. url,
  9. new JSONObject(params),
  10. new Response.Listener<JSONObject>() {
  11. @Override
  12. public void onResponse(JSONObject response) {
  13. Log.e(TAG, "response : " + response.toString());
  14. }
  15. },
  16. new Response.ErrorListener() {
  17. @Override
  18. public void onErrorResponse(VolleyError error) {
  19. Log.e("Error: ", error.getMessage());
  20. }
  21. });
  22. mQueue.add(postRequest);
  23. }

要注意,上传的参数并不是按照key-value拼接起来放在body中上传的,而是按照json的形式上传的,因此,服务端用request.getParameter("key")这种形式是无法取出来value的,只能是request.getInputStream(),然后把整个的body还原出原来的json串,然后从json中再取值。

时间: 2024-11-09 20:12:43

android volley框架的相关文章

Android Volley 框架的使用(一)

为什么要使用Volley框架 开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Req

Android Volley框架完全解析

2013年Google I/O大会上推出了一个新的网络通信框架--Volley.Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片.除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如

Android——Volley框架学习总结

Volley框架特点: 适用于频繁请求而每次请求数据量不会很大: 在请求的基础上做了磁盘缓存: 防止多次相同请求浪费资源: 提供String.Json.图片异步下载: 网络请求的优先级处理: 图片请求无需担心生命周期问题. Volley框架使用: 首先,通过Volley的静态方法new一个请求队列 1 RequestQueue mQueue = Volley.newRequestQueue(context); 假如我们创建一个StringRequest实例(Volley提供,StringRequ

android Volley 框架详解

开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在

Android Volley框架的使用

在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问频繁.通信数据量小的情况. 下载volley.jar文件并导入工程,加上访问网络的权限,就可以使用Volley框架访问网络了. <uses-permission android:name="android.permission.INTERNET"/> 访问的过程也十分简单:(1)

Android Volley框架的使用(二)

使用请求队列RequestQueue Volley中的Request都需要添加到RequestQueue中才能执行,所以首先需要创建一个RequestQueue RequestQueue = Volley.newRequestQueue(mContext); 通常情况在一个应用中需要统一管理一个请求队列,所以采用单例模式(注意:这不是必须的),创建一个类并在这个类中初始化RequestQueue等核心对象,以及实现一些我们所需的方法: 代码如下: package com.javen.volley

Android Volley框架的使用(三)

Image Request 为了更方便的使用Volley中的图片请求,我们同样先在VolleyController类中封装一个ImageLoader package com.javen.volley; import android.content.Context; import android.text.TextUtils; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.

Android Volley框架使用流程(源码方面)

以前在android上网络通信都是使用的Xutils 因为用它可以顺道处理了图片和网络这两个方面,后来发觉Xutils里面使用的是HttpClient  而Google在6.0的版本上已经把HttpClient废除了,所以开始寻找新的网络框架,okhttp也用过,但是它是在作用在UI线程,使用起来还需要用handler 所以就先用着Volley框架了.  这里我先分析下Volley框架的简单网络请求的源码. 使用Volley请求网络数据的简单过程: RequestQueue queue = Vo

Android Volley框架详解

注:文章出自http://blog.csdn.net/guolin_blog/article/details/17482095,有兴趣可以先去阅读. Volley简介 对于Android系统网络通信,我们知道目前用的最普遍的就是HttpClient和HttpURLConnection,但是HttpURLConnection和HttpClient的用法还是稍微有些复杂的,需要我们去封装代码,减少冗余度.Google开发团队也看到了这个问题,所以在2013年Google I/O大会上推出了一个新的网

Android Volley 框架JSON中文乱码问题的解决

近期在项目中使用Volley作为网络通信框架,却发现在传输中文时会出现乱码.先交代一下项目的软硬件的基础设施 线上: Django+restful_framework+monogdb APP: Android + volley 在使用android端测试之前,我使用了chrome中的Postman这款插件进行了测试,发现,中文读取是正常的.说明服务器返回的是UTF-8字符编码的数据. 但是为什么在Android端会出现乱码的现象呢. 我在想是不是本地端的字符编码出了问题? 我就是用String类