【致谢,引用,声明,前言】
关于GSON和VOLLEY,我百度了很多资料,个人感觉有两篇博客介绍的特别好,附上链接咯:
GSON: http://blog.csdn.net/lk_blog/article/details/7685169
VOLLEY:http://blog.csdn.net/guolin_blog/article/details/17482165 .
使用的数据源url是根据徐大神在慕课网的视频里提到的url,不知道能不能在这里发,就不单独发了,反正会在代码出现的。
关于在Android Studio中导入jar包,貌似方法有很多,我导入VOLLEY和GSON是采用复制到lib目录下,然后右键->As a Library,选中自己的Module:
如图 (源自网络)
======================================================
【废话】
我这篇比较基础和入门,主要是融合了GSON VOLLEY搭配V7 V4 包里的RecyclerView和SwipeRefreshLayout,做一个简单的DEMO。实现加载网络数据,并显示。利用两个新控件做一个ListVIew的上下拉刷新的效果。
后续会不断的完善!欢迎各位提意见和BUG。
为什么要用Android Studio,就不用说了吧,好吧 我说一下,因为我最近在换工作,70%的公司都要求使用Android Stuido。不过其实AS用习惯了还是很爽的,我现在都不想在Eclipse上码代码了。
效果图:
======================================================
【构建实体类DataBean.java】
以前我加载网络数据一般会用到HttpUrlConnection,然后根据返回的InputStream,读取并处理成一串String数据(就是返回的json数据)。
然后再将这串String解析成JSONObject,再根据json的格式不断的解析JSONArray...JSONObject...,最终得到我们的目标数据集合List<DataBean> mDatas。
经常一个粗心就哪里写错了,而且代码重复量实在太大。利用GSON和VOLLEY,我只想说一句,秒 射 处理。
直接看代码:
首先是根据url返回的json,构建一个实体类: 我们这里返回的json格式为:
{
"status": 1,
"data": [
{
"id": 1,
"name": "Tony老师聊shell——环境变量配置文件",
"picSmall": "http://img.mukewang.com/55237dcc0001128c06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/55237dcc0001128c06000338.jpg",
"description": "为你带来shell中的环境变量配置文件",
"learner": 12312
},
{
"id": 2,
"name": "数学知识在CSS动画中的应用",
"picSmall": "http://img.mukewang.com/55249cf30001ae8a06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/55249cf30001ae8a06000338.jpg",
"description": "数学知识与CSS结合实现酷炫效果",
"learner": 45625
},
。。。。。。。。。
我们根据"data"数组里的数据格式,构建DataBean.java: (这个是跟GSON解析相关的)
package com.mcxtzhang.demo.windrecyclerdemo; /** * Created by zhangxutong on 2015/12/28. */ public class DataBean { private String name; private String picSmall; public String getName() { return name; } public String getPicSmall() { return picSmall; } public void setName(String name) { this.name = name; } public void setPicSmall(String picSmall) { this.picSmall = picSmall; } /* @Override public String toString() { return "DataBean{" + "name='" + name + '\'' + ", picSmall='" + picSmall + '\'' + '}'; }*/ }这里说一个我自己
字段(属性)的命名,我是跟json数据里的字段保持一致的。OK,实体类构建完毕,继续。
======================================================
【使用VOLLEY】
下面就是使用VOLLEY了,请添加网络访问权限!请添加网络访问权限!请添加网络访问权限! 重要的事说三遍,有的同学没添加,不停的报错/运行结果不正确,
<uses-permission android:name="android.permission.INTERNET" />
然后,根据郭神blog所述,VOLLEY使用三部曲:
1. 创建一个RequestQueue对象。
//Volley begin private RequestQueue mQueue; private static final String url = "http://www.imooc.com/api/teacher?type=4&num=30"; //Volley end
2. 创建一个JsonRequest对象。 (摘自郭神blog,重点标红:类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。)
本例url返回的是JSONObject,所以用JsonObjectRequest对象。
//Volley begin //GET 方式的http /*StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, error.getMessage(), error); } }); mQueue.add(stringRequest);*/ //json 四个参数分别是:url, JSONObject对象这里为null,一个请求成功的Listener,和一个请求失败的Listener: // JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { // Log.i(TAG,jsonObject.toString()); if(null!=jsonObject){ try { //传入的"data" 是根据json返回字符串得来的 JSONArray jsonArray = jsonObject.getJSONArray("data"); //上一句代码可能报错,确认不报错再创建下面的对象 //注释掉的是 原本不使用GSON的解析方法 /*mDatas = new ArrayList<DataBean>(); for (int i=0;i<jsonArray.length();i++){ JSONObject jsonData = jsonArray.getJSONObject(i); DataBean data = new DataBean(); data.setName(jsonData .getString("name")); data.setPicSmall(jsonData.getString("picSmall")); mDatas.add(data); }*/ //使用GSON加载 begin String dataString = jsonArray.toString(); Gson gson = new Gson(); mDatas = gson.fromJson(dataString, new TypeToken<List<DataBean>>() {}.getType()); //使用GSON加载 end //数据加载完后 再加载适配器 init(); } catch (JSONException e) { e.printStackTrace(); } } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.i(TAG,volleyError.getMessage(),volleyError); } });
3. 将JsonRequest对象添加到RequestQueue里面。
mQueue.add(jsonObjectRequest);
//Volley end
忽略init();里面是适配器的设置和下拉刷新的代码。这里不用care。
======================================================
【GSON】:
上述 步骤 2,里已经包括GSON的使用代码:
这里是将json数据转化为带泛型的List 集合。
private List<DataBean> mDatas