Android Volley和Gson实现网络数据加载

先看接口

1 升级接口

http://s.meibeike.com/mcloud/ota/cloudService

POST请求

参数列表如下

mainversion 1.0

commoninfo {"timestamp":"1450772874213","clientversion":"6.0","clientdescription":"goof","commonversion":"1.0","format":"json","clienttype":"3"}

json {"yunbangsn":"","pcode":"ncc","subversion":0,"clienttype":"3","innerversion":2015121821,"function":118}

返回信息如下

{
    "code": 0,
    "type": "0",
    "url": "http://d.meibeike.com/mcfs/ota/client/2015-12-18/CloudBar_2015121818_1.0.2.9.apk",
    "function": 118,
    "message": "成功获取版本信息",
    "displayversion": "1.0.2.9",
    "filesize": 6363546,
    "subversion": 0,
    "innerversion": 2015121818,
    "updatemsg": "1.修改投射提示“USB导入出错”问题\r\n2.修改偶然性崩溃\r\n3.修改偶然性已绑定用户由于某些操作后变成了未绑定用户,数据丢失",
    "updatemsg_cn": "1.修改投射提示“USB导入出错”问题\r\n2.修改偶然性崩溃\r\n3.修改偶然性已绑定用户由于某些操作后变成了未绑定用户,数据丢失",
    "md5": "727c136c7914ffa8f480bf4d2037871d",
    "updatemsg_tw": null,
    "forceflag": "0"
}

上代码

public class MainActivity extends Activity {

  TextView show;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    show = (TextView)findViewById(R.id.show);

    Button test = (Button)findViewById(R.id.test);
    test.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {

        RequestQueue queue = MyVolley.getRequestQueue();
        GsonRequestNew<Cloud103Entity> myReq = new GsonRequestNew<Cloud103Entity>(Method.POST,
                                                "http://192.168.2.33:8084/mcloud/cloudclub/cloudService",
                                                Cloud103Entity.class,
                                                createMyReqSuccessListener(),
                                                createMyReqErrorListener()){
          //传参数
          protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("mainversion", "1.0");
            params.put("commoninfo", getCommoninfo());
            params.put("json", getJson());
            Log.i("TAG", "发送参数" + params);
            return params;
        };

        };

        Log.i("TAG", "发送URL" + "http://192.168.2.33:8084/mcloud/cloudclub/cloudService");

        queue.add(myReq);

      }
    });
  }

  protected String getCommoninfo() {

    JSONObject commoninfo = new JSONObject();
    try {
      commoninfo.put("commonversion", "1.0");
      commoninfo.put("clienttype", "3");
      commoninfo.put("clientversion", "6.0");
      commoninfo.put("clientdescription", "goof");
      commoninfo.put("timestamp", "1450765392640");
      commoninfo.put("format", "json");
    } catch (JSONException e) {
      Log.i("TAG", "e---" + e.getMessage());
    }

    return commoninfo.toString();
  }

  protected String getJson() {

    JSONObject json = new JSONObject();
    try {
    json.put("function", 103);
    json.put("subversion", 0);
    json.put("userid", "mm730@mbk.com");
    json.put("password", "e10adc3949ba59abbe56e057f20f883e");
    json.put("accounttype", 0);
    } catch (JSONException e) {
      Log.i("TAG", "e---" + e.getMessage());
    }

    return json.toString();
  }

  private Response.Listener<Cloud103Entity> createMyReqSuccessListener() {
      return new Response.Listener<Cloud103Entity>() {
          @Override
          public void onResponse(Cloud103Entity response) {
            show.setText(response.getMessage());
          }
      };
  }

  private Response.ErrorListener createMyReqErrorListener() {
      return new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
            show.setText(error.getMessage());
          }
      };
  }

}
public class GsonRequestNew<T> extends Request<T> {
  private final Listener<T> mListener;

  private Gson mGson;

  private Class<T> mClass;

  public GsonRequestNew(int method, String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
    super(method, url, errorListener);
    mGson = new Gson();
    mClass = clazz;
    mListener = listener;
  }

  public GsonRequestNew(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
    this(Method.GET, url, clazz, listener, errorListener);
  }

  @Override
  protected Response<T> parseNetworkResponse(NetworkResponse response) {
    try {
      String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
      Log.i("TAG", "响应" + jsonString);
      return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
      return Response.error(new ParseError(e));
    }
  }

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

}
public class Cloud103Entity {

  private ArrayList<String> bindlist;
  private String message;// 返回信息
  private String sessionkey;// 登录成功后,后续操作以此sessionKey为准
  private String username;
  private short subversion = 0;// 业务接口协议版本号
  private String email;// email号码账号
  private long meiid;// 美贝壳内部id
  private int faceid;// 用户头像id
  private int code;// 返回码
  private String faceurl;// 用户头像url
  private String mobile;// 手机号码账号
  private int function;

  public ArrayList<String> getBindlist() {
    return this.bindlist;
  }

  public void setBindlist(ArrayList<String> bindlist) {
    this.bindlist = bindlist;
  }

  public String getMessage() {
    return this.message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public String getSessionkey() {
    return this.sessionkey;
  }

  public void setSessionkey(String sessionkey) {
    this.sessionkey = sessionkey;
  }

  public String getUsername() {
    return this.username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public short getSubversion() {
    return this.subversion;
  }

  public void setSubversion(short subversion) {
    this.subversion = subversion;
  }

  public String getEmail() {
    return this.email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public long getMeiid() {
    return this.meiid;
  }

  public void setMeiid(long meiid) {
    this.meiid = meiid;
  }

  public int getFaceid() {
    return this.faceid;
  }

  public void setFaceid(int faceid) {
    this.faceid = faceid;
  }

  public int getCode() {
    return this.code;
  }

  public void setCode(int code) {
    this.code = code;
  }

  public String getFaceurl() {
    return this.faceurl;
  }

  public void setFaceurl(String faceurl) {
    this.faceurl = faceurl;
  }

  public String getMobile() {
    return this.mobile;
  }

  public void setMobile(String mobile) {
    this.mobile = mobile;
  }

  public int getFunction() {
    return this.function;
  }

  public void setFunction(int function) {
    this.function = function;
  }

  /**
   *
   * { "bindlist": [ "C001B00010000008" ], "message": "登录成功", "sessionkey":
   * "DC385A65D2FEA3FB2021F3F717B4FCD1", "username": "", "subversion": 0,
   * "email": "mm730@mbk.com", "meiid": 1000023, "faceid": 0, "code": 0,
   * "faceurl": "", "mobile": "", "function": "103" }
   */
}
public class MyApp extends Application{

  @Override
  public void onCreate() {
    super.onCreate();

    MyVolley.init(this);
  }

}
public class MyVolley {

  private static RequestQueue mRequestQueue;

  static void init(Context context) {
    mRequestQueue = Volley.newRequestQueue(context);
  }

  public static RequestQueue getRequestQueue() {
    if (mRequestQueue != null) {
        return mRequestQueue;
    } else {
        throw new IllegalStateException("RequestQueue not initialized");
    }
}
}

Code见 https://github.com/huanyi0723/VolleyGson/

Volley代码剖析
Volley
   和 Volley 框架同名的类,其实是个工具类,作用是构建一个可用于添加网络请求的 RequestQueue 对象
Request
   网络请求的抽象类。我们通过构建一个 Request 类的非抽象子类(StringRequest、JsonRequest、ImageRequest 或自定义)对象
   Volley 支持 8 种 Http 请求方式 GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, PATCH
   Request 类中包含了请求 url,请求请求方式,请求 Header,请求 Body,请求的优先级等信息
   子类必须重写的两个方法
    parseNetworkResponse() //将网络返回的原生字节内容,转换成合适的类型
    deliverResponse() //将解析成合适类型的内容传递给它们的监听回调
    getBody() //可以构建用于 POST、PUT、PATCH 请求方式的 Body 内容
    getParams() // getBody 函数没有被重写情况下,此方法的返回值会被 key、value 分别编码后拼装起来转换为字节码作为 Body 内容
RequestQueue
   Volley 框架的核心类,将请求 Request 加入到一个运行的 RequestQueue 中,来完成请求操作
   mCacheQueue  //缓存请求队列
   mNetworkQueue  //网络请求队列
   mCurrentRequests //正在进行中,尚未完成的请求集合
   mWaitingRequests  //等待请求的集合
   start() //开启一个缓存调度线程 CacheDispatcher 和 n 个网络调度线程 NetworkDispatcher ,这里 n 默认为 4
   add() //加入请求
   finish() //请求完成
   cancelAll() //请求取消
CacheDispatcher
   一个线程,用于调度处理走缓存的请求
   mCacheQueue //缓存请求队列
   mNetworkQueue  //网络请求队列
   mCache  //代表了一个可以获取请求结果,存储请求结果的缓存
   mDelivery  //请求结果传递类
NetworkDispatcher
   一个线程,用于调度处理走网络的请求
   mQueue  //网络请求队列
   mNetwork  //网络类,代表了一个可以执行请求的网络
   mCache  //缓存类
   mDelivery  //请求结果传递类
Cache
   缓存接口,代表了一个可以获取请求结果,存储请求结果的缓存
   get() //通过 key 获取请求的缓存实体
   put() //存入一个请求的缓存实体
   remove() //移除指定的缓存实体
   clear() //清空缓存
   内部类 Entry //代表缓存实体
      data  //请求返回的数据(Body 实体)
      etag  //Http 响应首部中用于缓存新鲜度验证的 ETag
            serverDate  //Http 响应首部中的响应产生时间
      ttl  //缓存的过期时间
      softTtl  //缓存的新鲜时间
      responseHeaders  //响应的 Headers
      isExpired()  //判断缓存是否过期,过期缓存不能继续使用
      refreshNeeded()  //判断缓存是否新鲜,不新鲜的缓存需要发到服务端做新鲜度的检测
DiskBasedCache
   继承 Cache 类,基于 Disk 的缓存实现类
   initialize() //初始化,扫描缓存目录得到所有缓存数据摘要信息放入内存
   get() //从缓存中得到数据。先从摘要信息中得到摘要信息,然后读取缓存数据文件得到内容
   put() //将数据存入缓存内。先检查缓存是否会满,会则先删除缓存中部分数据,然后再新建缓存文件
   pruneIfNeeded() //检查是否能再分配 neededSpace 字节的空间,如果不能则删除缓存中部分数据
   remove() //移除指定的缓存实体
   clear() //清空缓存
   内部类CacheHeader //缓存文件摘要信息,存储在缓存文件的头部
NoCache
   继承 Cache 类,不做任何操作的缓存实现类,可将它作为构建 RequestQueue 的参数以实现一个不带缓存的请求队列

Network
   代表网络的接口,处理网络请求
   performRequest() //用于执行特定请求
NetworkResponse
   Network 中方法 performRequest 的返回值
   封装了网络请求响应的 StatusCode,Headers 和 Body 等
   statusCode  //Http 响应状态码
   data  //Body 数据
   headers //表示是否为 304 响应
   networkTimeMs  //请求耗时
BasicNetwork
   Volley 中默认的网络接口实现类。调用 HttpStack 处理请求,
   并将结果转换为可被 ResponseDelivery 处理的 NetworkResponse
HttpStack
   用于处理 Http 请求,返回请求结果的接口
   performRequest() //执行 Request 代表的请求,第二个参数表示发起请求之前,添加额外的请求 Headers
HttpClientStack
   实现 HttpStack 接口,利用 Apache 的 HttpClient 进行各种请求方式的请求
HurlStack
   实现 HttpStack 接口,利用 Java 的 HttpURLConnection 进行各种请求方式的请求
Response
   封装了经过解析后的数据,用于传输。
   并且有两个内部接口 Listener 和 ErrorListener 分别可表示请求失败和成功后的回调。
ByteArrayPool
   byte[] 的回收池,用于 byte[] 的回收再利用,减少了内存的分配和回收
PoolingByteArrayOutputStream
   继承 ByteArrayOutputStream,原始 ByteArrayOutputStream 中用于接受写入 bytes 的 buf,
   每次空间不足时便会 new 更大容量的 byte[],
   而 PoolingByteArrayOutputStream 使用了 ByteArrayPool 作为 Byte[] 缓存来减少这种操作,从而提高性能
HttpHeaderParser
   Http header 的解析工具类,在 Volley 中主要作用是用于解析 Header 从而判断返回结果是否需要缓存,
   如果需要返回 Header 中相关信息
   parseDateAsEpoch() //解析时间,将 RFC1123 的时间格式,解析成 epoch 时间
   parseCharset() //解析编码集,在 Content-Type 首部中获取编码集,如果没有找到,默认返回 ISO-8859-1
   parseCacheHeaders() 通过网络响应中的缓存控制 Header 和 Body 内容,构建缓存实体。
      如果 Header 的 Cache-Control 字段含有 no-cache 或 no-store 表示不缓存,返回 null
RetryPolicy
   重试策略接口
   getCurrentTimeout() //获取当前请求用时
   getCurrentRetryCount() //获取已经重试的次数
   retry() //确定是否重试
DefaultRetryPolicy
    Volley 默认的重试策略实现类
    mCurrentRetryCount  //已经重试次数
    mBackoffMultiplier
    mCurrentTimeoutMs //当前重试的 timeout 时间
ResponseDelivery
   请求结果的传输接口,用于传递请求结果或者请求错误
   postResponse() //此方法用于传递请求结果, request  和  response  参数分别表示请求信息和返回结果信息
   postResponse() //此方法用于传递请求结果,并在完成传递后执行 Runnable
   postError() //传输请求错误
ExecutorDelivery
   请求结果传输接口具体实现类
   在 Handler 对应线程中传输缓存调度线程或者网络调度线程中产生的请求结果或请求错误,
   会在请求成功的情况下调用 Request.deliverResponse(…) 函数,失败时调用 Request.deliverError(…) 函数

Android Volley和Gson实现网络数据加载的更多相关文章

  1. Android 学习笔记之Volley(八)实现网络图片的数据加载

    PS:最后一篇关于Volley框架的博客... 学习内容: 1.使用ImageRequest.java实现网络图片加载 2.使用ImageLoader.java实现网络图片加载 3.使用NetWork ...

  2. Google官方网络框架-Volley的使用解析Json以及加载网络图片方法

    Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...

  3. android优化从网络中加载图片速度。。

    从网络中加载图片主要要注意两个方面的问题: 1.内存管理:图片占的内存很大,假如图片数量多,很容易让系统抛出out of memory的异常. 同时我们也要注意不同android版本中内存管理的区别. ...

  4. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  5. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  6. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  7. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  8. Echarts通过Ajax实现动态数据加载

    Echarts(3.x版)官网实例的数据都是静态的,实际使用中往往会要求从服务器端取数据进行动态显示,官网教程里给出的异步数据加载很粗略,下面就以官网最简单的实例为例子,详细演示如下过程:1.客户端通 ...

  9. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

随机推荐

  1. Java-马士兵动态代理模式

    Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...

  2. hdu5713 K个联通块[2016百度之星复赛B题]

    dp 代码 #include<cstdio> ; ; int n,m,k,cnt[N]; ]; ][],i,j,l,a,b; int check(int x,int y) { int i; ...

  3. swift基础:第四部分:对函数和闭包的深入

    ()之前在什么公司,都自己做过哪些项目,从架构的角度来谈谈你的项目. () 你对iOS不同版本是怎么看的,你在做项目的过程当中,是如何应对版本问题的. () 你对iOS的性能是怎么优化的. () 你通 ...

  4. linux软连接和硬链接

    1.软连接(符号连接)创建方法(相当于windows的快捷方式) # ln -s 原文件 连接文件(最好使用绝对路径) 特点: 1.软连接文件是777的权限,而且很小很小: 2.可以跨分区(文件系统) ...

  5. 自定cordova插件笔记demo

    1.在项目根目录下(我的是com.chl),添加一个文件夹,在文件夹里添加src.www两个子文件夹和plugin.xml文件.在www目录下,创建test.js.在src文件夹下添加android子 ...

  6. java高新技术-泛型

    1.体验泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时去除掉"类型"信息,使程序运行小效率不受影响 ...

  7. python分割字符串split,filter函数用法

    现有字符串,需要取出用空格分隔的第一段,操作如下 >>> product_model = ‘WS-C2960G-24TC-L – Fixed Module 0′>>> ...

  8. java笔记--异常详解与处理

    一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出.     2.只有此类或其子类才 ...

  9. 字符串表达式String Expressions

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...