OkHttp是Google推荐使用的一个开源的网络请求框架,Android开发中涉及到网络请求和接口调用现在大部分都是使用OkHttp,网上已经有不少人针对OkHttp进行了封装,这里推荐一下鸿洋大神的okhttputils,这是针对OkHttp进行的封装,使用起来特别方便,下载地址:https://github.com/hongyangAndroid/okhttputils。

  fastjson是一个针对json格式数据的解析处理框架,下载地址:https://github.com/alibaba/fastjson,Android端和服务端进行交互时,数据传输格式一般都采用JSON格式,对于JSON数据的解析,在Android端通常用gson解析,当然也可以fastjson去解析数据,今天就来学习和总结一下如何使用fastjson去解析json格式数据。

  首先在 build.gradle 引入okhttputils和fastjson,

  配置如下:

   compile 'com.zhy:okhttputils:2.6.2'

  compile 'com.alibaba:fastjson:1.1.56.android'

  okHttpUtils需要先初始化才能够使用,那么什么时机初始化最合适呢,最好的时机就是在App启动的时候就完成初始化工作,自然而然我们想到了用Android提供的Application类去做这件事,Application是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单,创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

  新建一个MyApplication类,继承Application,重写onCreate方法,然后在onCreate方法中完成对okHttpUtils的初始化工作,代码如下所示:

 1 package com.nyl.okhttputilstest;
 2
 3 import android.app.Application;
 4
 5 import com.zhy.http.okhttp.OkHttpUtils;
 6
 7 import java.util.concurrent.TimeUnit;
 8
 9 import okhttp3.OkHttpClient;
10
11 /**
12  * 定义一个Application
13  */
14
15 public class MyApplication extends Application{
16
17     @Override
18     public void onCreate() {
19         super.onCreate();
20         /**
21          * 初始化OkHttpUtils
22          */
23         initOkHttpClient();
24     }
25
26     private void initOkHttpClient() {
27         OkHttpClient okHttpClient = new OkHttpClient.Builder()
28                 .connectTimeout(10000L, TimeUnit.MILLISECONDS) //链接超时
29                 .readTimeout(10000L,TimeUnit.MILLISECONDS) //读取超时
30                 .build(); //其他配置
31
32         OkHttpUtils.initClient(okHttpClient);
33     }
34 }

  注意:MyApplication类需要在AndroidManifest.xml配置才会生效,如下图:

  

  接下来就可以使用okHttpUtils处理网络请求了,修改HomeFragment类,代码如下所示:

  1 package com.nyl.shoppingmall.home.fragment;
  2
  3 import android.support.v7.widget.RecyclerView;
  4 import android.util.Log;
  5 import android.view.View;
  6 import android.widget.ImageView;
  7 import android.widget.TextView;
  8 import android.widget.Toast;
  9
 10 import com.alibaba.fastjson.JSON;
 11 import com.nyl.shoppingmall.R;
 12 import com.nyl.shoppingmall.base.BaseFragment;
 13 import com.nyl.shoppingmall.home.bean.ResultBeanData;
 14 import com.nyl.shoppingmall.utils.Constans;
 15 import com.zhy.http.okhttp.OkHttpUtils;
 16 import com.zhy.http.okhttp.callback.StringCallback;
 17
 18 import okhttp3.Call;
 19
 20 /**
 21  * 首页Fragment
 22  */
 23 public class HomeFragment extends BaseFragment implements View.OnClickListener {
 24
 25     private final static String TAG = HomeFragment.class.getSimpleName();
 26
 27     private TextView tv_search_home;
 28     private TextView tv_message_home;
 29     private RecyclerView rv_home;
 30     private ImageView ib_top;
 31     //返回的数据
 32     private ResultBeanData.ResultBean resultBean;
 33
 34     @Override
 35     public View initView() {
 36         Log.e(TAG,"主页面的Fragment的UI被初始化了");
 37         View view = View.inflate(mContext,R.layout.fragment_home,null);
 38         //初始化布局控件
 39         tv_search_home = (TextView) view.findViewById(R.id.tv_search_home);
 40         tv_message_home = (TextView) view.findViewById(R.id.tv_message_home);
 41         rv_home = (RecyclerView) view.findViewById(R.id.rv_home);
 42         ib_top = (ImageView) view.findViewById(R.id.ib_top);
 43
 44         //设置点击事件
 45         ib_top.setOnClickListener(this);
 46         tv_search_home.setOnClickListener(this);
 47         tv_message_home.setOnClickListener(this);
 48         return view;
 49     }
 50
 51
 52     @Override
 53     public void initData() {
 54         super.initData();
 55         Log.e(TAG,"主页面的Fragment的数据被初始化了");
 56
 57         //联网请求首页数据
 58         getDataFromNet();
 59     }
 60
 61     private void getDataFromNet() {
 62         String url = Constans.HOME_URL;
 63         OkHttpUtils
 64                 .get()
 65                 .url(url)
 66                 .build()
 67                 .execute(new StringCallback()
 68                 {
 69
 70                     /**
 71                      * 请求失败的时候回调
 72                      * @param call
 73                      * @param e
 74                      * @param id
 75                      */
 76                     @Override
 77                     public void onError(Call call, Exception e, int id) {
 78
 79                         Log.e(TAG,"首页请求失败=="+e.getMessage());
 80                     }
 81
 82                     /**
 83                      * 当请求成功的时候回调
 84                      * @param response 请求成功数据
 85                      * @param id
 86                      */
 87                     @Override
 88                     public void onResponse(String response, int id) {
 89
 90                         Log.e(TAG,"首页请求成功=="+response);
 91                         //解析数据
 92                         processData(response);
 93                     }
 94                 });
 95     }
 96
 97     private void processData(String json) {       //使用FastJson去解析Json数据,将json字符串转换成一个ResultBeanData对象
 98         ResultBeanData resultBeanData = JSON.parseObject(json,ResultBeanData.class);
 99         resultBean = resultBeanData.getResult();
100         Log.e(TAG,"解析成功=="+resultBean.getHot_info().get(0).getName());
101     }
102
103     @Override
104     public void onClick(View view) {
105         switch (view.getId()){
106             case R.id.ib_top: //置顶的监听
107                 rv_home.scrollToPosition(0);
108                 break;
109             case R.id.tv_search_home:  //搜索的监听
110                 Toast.makeText(mContext,"搜索",Toast.LENGTH_SHORT).show();
111                 break;
112             case R.id.tv_message_home: //消息监听
113                 Toast.makeText(mContext,"进入消息中心",Toast.LENGTH_SHORT).show();
114                 break;
115         }
116     }
117 }

  我们在initData()中调用getDataFromNet方法联网请求数据,getDataFromNet方法内部调用okHttpUtils发起异步网络请求,okHttpUtils通过一个StringCallBack来通知调用者本次网络请求的结果,当请求失败的时候回调onError方法,用来通知调用者网络请求失败,当请求成功的时候回调onResponse方法,用来通知调用者网络请求成功,我们就可以在onResponse方法中接收服务器返回的数据,然后根据我们的需求处理数据。

  为了方便管理接口请求的URL地址,我们将URL地址统一配置在Constans类中,代码如下所示:

 1 package com.nyl.shoppingmall.utils;
 2
 3 /**
 4  * 配置各个页面联网地址
 5  */
 6
 7 public class Constans {
 8
 9     //首页路径
10     public static String HOME_URL = "http://192.168.1.108:8080/atguigu/json/HOME_URL.json";
11 }

  这里我使用的是我本地的服务器IP地址,那么如何查看本地的服务器IP地址呢,打开命令行,输入ipconfig,如下图:

   

  由于在本地请求,记得开tomcat服务器,我们试着用http://192.168.1.108:8080/atguigu/json/HOME_URL.json在浏览去中打开,若地址是正确的,如下图:

  最后不要忘记加网络权限:<uses-permission android:name="android.permission.INTERNET"/>

  运行程序,效果如下图:

  我们在请求成功的时候回调的onResponse方法里去接收服务器返回的json格式数据,然后通过Fastjson将json数据解析成一个ResultBeanData对象。

  ResultBeanData类的代码如下所示:

  1 package com.nyl.shoppingmall.home.bean;
  2
  3 import java.util.List;
  4
  5 /**
  6  * Created by Administrator on 2017/3/21 0021.
  7  */
  8
  9 public class ResultBeanData {
 10
 11     /**
 12      * code : 200
 13      * msg : 请求成功
 14      *
 15      */
 16
 17     private int code;
 18     private String msg;
 19     private ResultBean result;
 20
 21     public void setCode(int code) {
 22         this.code = code;
 23     }
 24
 25     public void setMsg(String msg) {
 26         this.msg = msg;
 27     }
 28
 29     public void setResult(ResultBean result) {
 30         this.result = result;
 31     }
 32
 33     public int getCode() {
 34         return code;
 35     }
 36
 37     public String getMsg() {
 38         return msg;
 39     }
 40
 41     public ResultBean getResult() {
 42         return result;
 43     }
 44
 45     public static class ResultBean {
 46
 47         private SeckillInfoEntity seckill_info;
 48         private List<ActInfoEntity> act_info;
 49         private List<BannerInfoEntity> banner_info;
 50         private List<ChannelInfoEntity> channel_info;
 51         private List<HotInfoEntity> hot_info;
 52         private List<RecommendInfoEntity> recommend_info;
 53
 54         public void setSeckill_info(SeckillInfoEntity seckill_info) {
 55             this.seckill_info = seckill_info;
 56         }
 57
 58         public void setAct_info(List<ActInfoEntity> act_info) {
 59             this.act_info = act_info;
 60         }
 61
 62         public void setBanner_info(List<BannerInfoEntity> banner_info) {
 63             this.banner_info = banner_info;
 64         }
 65
 66         public void setChannel_info(List<ChannelInfoEntity> channel_info) {
 67             this.channel_info = channel_info;
 68         }
 69
 70         public void setHot_info(List<HotInfoEntity> hot_info) {
 71             this.hot_info = hot_info;
 72         }
 73
 74         public void setRecommend_info(List<RecommendInfoEntity> recommend_info) {
 75             this.recommend_info = recommend_info;
 76         }
 77
 78         public SeckillInfoEntity getSeckill_info() {
 79             return seckill_info;
 80         }
 81
 82         public List<ActInfoEntity> getAct_info() {
 83             return act_info;
 84         }
 85
 86         public List<BannerInfoEntity> getBanner_info() {
 87             return banner_info;
 88         }
 89
 90         public List<ChannelInfoEntity> getChannel_info() {
 91             return channel_info;
 92         }
 93
 94         public List<HotInfoEntity> getHot_info() {
 95             return hot_info;
 96         }
 97
 98         public List<RecommendInfoEntity> getRecommend_info() {
 99             return recommend_info;
100         }
101
102         public static class SeckillInfoEntity {
103
104             private String end_time;
105             private String start_time;
106             private List<ListEntity> list;
107
108             public void setEnd_time(String end_time) {
109                 this.end_time = end_time;
110             }
111
112             public void setStart_time(String start_time) {
113                 this.start_time = start_time;
114             }
115
116             public void setList(List<ListEntity> list) {
117                 this.list = list;
118             }
119
120             public String getEnd_time() {
121                 return end_time;
122             }
123
124             public String getStart_time() {
125                 return start_time;
126             }
127
128             public List<ListEntity> getList() {
129                 return list;
130             }
131
132             public static class ListEntity {
133
134                 private String cover_price;
135                 private String figure;
136                 private String name;
137                 private String origin_price;
138                 private String product_id;
139
140                 public void setCover_price(String cover_price) {
141                     this.cover_price = cover_price;
142                 }
143
144                 public void setFigure(String figure) {
145                     this.figure = figure;
146                 }
147
148                 public void setName(String name) {
149                     this.name = name;
150                 }
151
152                 public void setOrigin_price(String origin_price) {
153                     this.origin_price = origin_price;
154                 }
155
156                 public void setProduct_id(String product_id) {
157                     this.product_id = product_id;
158                 }
159
160                 public String getCover_price() {
161                     return cover_price;
162                 }
163
164                 public String getFigure() {
165                     return figure;
166                 }
167
168                 public String getName() {
169                     return name;
170                 }
171
172                 public String getOrigin_price() {
173                     return origin_price;
174                 }
175
176                 public String getProduct_id() {
177                     return product_id;
178                 }
179             }
180         }
181
182         public static class ActInfoEntity {
183
184             private String icon_url;
185             private String name;
186             private String url;
187
188             public void setIcon_url(String icon_url) {
189                 this.icon_url = icon_url;
190             }
191
192             public void setName(String name) {
193                 this.name = name;
194             }
195
196             public void setUrl(String url) {
197                 this.url = url;
198             }
199
200             public String getIcon_url() {
201                 return icon_url;
202             }
203
204             public String getName() {
205                 return name;
206             }
207
208             public String getUrl() {
209                 return url;
210             }
211         }
212
213         public static class BannerInfoEntity {
214
215             private String image;
216             private int option;
217             private int type;
218             private ValueEntity value;
219
220             public void setImage(String image) {
221                 this.image = image;
222             }
223
224             public void setOption(int option) {
225                 this.option = option;
226             }
227
228             public void setType(int type) {
229                 this.type = type;
230             }
231
232             public void setValue(ValueEntity value) {
233                 this.value = value;
234             }
235
236             public String getImage() {
237                 return image;
238             }
239
240             public int getOption() {
241                 return option;
242             }
243
244             public int getType() {
245                 return type;
246             }
247
248             public ValueEntity getValue() {
249                 return value;
250             }
251
252             public static class ValueEntity {
253                 /**
254                  * url : /act20161111?cyc_app=1
255                  */
256
257                 private String url;
258
259                 public void setUrl(String url) {
260                     this.url = url;
261                 }
262
263                 public String getUrl() {
264                     return url;
265                 }
266             }
267         }
268
269         public static class ChannelInfoEntity {
270             /**
271              * channel_name : 服饰
272              * image : /app/img/menu-cyc.png
273              * option : 2
274              * type : 1
275              * value : {"channel_id":"8"}
276              */
277
278             private String channel_name;
279             private String image;
280             private int option;
281             private int type;
282             private ValueEntity value;
283
284             public void setChannel_name(String channel_name) {
285                 this.channel_name = channel_name;
286             }
287
288             public void setImage(String image) {
289                 this.image = image;
290             }
291
292             public void setOption(int option) {
293                 this.option = option;
294             }
295
296             public void setType(int type) {
297                 this.type = type;
298             }
299
300             public void setValue(ValueEntity value) {
301                 this.value = value;
302             }
303
304             public String getChannel_name() {
305                 return channel_name;
306             }
307
308             public String getImage() {
309                 return image;
310             }
311
312             public int getOption() {
313                 return option;
314             }
315
316             public int getType() {
317                 return type;
318             }
319
320             public ValueEntity getValue() {
321                 return value;
322             }
323
324             public static class ValueEntity {
325                 /**
326                  * channel_id : 8
327                  */
328
329                 private String channel_id;
330
331                 public void setChannel_id(String channel_id) {
332                     this.channel_id = channel_id;
333                 }
334
335                 public String getChannel_id() {
336                     return channel_id;
337                 }
338             }
339         }
340
341         public static class HotInfoEntity {
342             /**
343              * cover_price : 159.00
344              * figure : /1477984921265.jpg
345              * name : 现货【一方尘寰】剑侠情缘三剑三七秀 干将莫邪 90橙武仿烧蓝复古对簪
346              * product_id : 9356
347              */
348
349             private String cover_price;
350             private String figure;
351             private String name;
352             private String product_id;
353
354             public void setCover_price(String cover_price) {
355                 this.cover_price = cover_price;
356             }
357
358             public void setFigure(String figure) {
359                 this.figure = figure;
360             }
361
362             public void setName(String name) {
363                 this.name = name;
364             }
365
366             public void setProduct_id(String product_id) {
367                 this.product_id = product_id;
368             }
369
370             public String getCover_price() {
371                 return cover_price;
372             }
373
374             public String getFigure() {
375                 return figure;
376             }
377
378             public String getName() {
379                 return name;
380             }
381
382             public String getProduct_id() {
383                 return product_id;
384             }
385         }
386
387         public static class RecommendInfoEntity {
388
389             private String cover_price;
390             private String figure;
391             private String name;
392             private String product_id;
393
394             public void setCover_price(String cover_price) {
395                 this.cover_price = cover_price;
396             }
397
398             public void setFigure(String figure) {
399                 this.figure = figure;
400             }
401
402             public void setName(String name) {
403                 this.name = name;
404             }
405
406             public void setProduct_id(String product_id) {
407                 this.product_id = product_id;
408             }
409
410             public String getCover_price() {
411                 return cover_price;
412             }
413
414             public String getFigure() {
415                 return figure;
416             }
417
418             public String getName() {
419                 return name;
420             }
421
422             public String getProduct_id() {
423                 return product_id;
424             }
425         }
426     }
427 }

  这个javabean的属性很多,和返回的json数据格式里面的字段是一一对应的,写起来可能会比较费时,当然我们有可以偷懒的办法,这里介绍一个插件GsonFormat,这个插件是可以根据json格式数据去生成对应的javabean的,这个插件的安装方式和跟安装butterknife插件是一样的做法,这里就不再细说如何安装GsonFormat插件了,主要是讲讲GsonFormat插件的用法,用法如下:

  新建一个ResultBeanData类,先不要定义属性,然后打开GsonFormat插件,然后将json格式数据复制到GsonFormat,点击OK按钮就可以在ResultBeanData类生成对应的属性了,如下图所示:

  

  ResultBeanData类中的那一堆属性就是这样生成的,简单方便快捷!

  关于OkHttpUtils 请求网络 + 使用 fastjson解析数据就那么多! 

转载于:https://www.cnblogs.com/nylcy/p/6595263.html

Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据...相关推荐

  1. Android商城开发系列

    Android商城开发系列(一)--开篇 Android商城开发系列(二)--App启动欢迎页面制作 Android商城开发系列(三)--使用Fragment+RadioButton实现商城底部导航栏 ...

  2. Android商城开发系列(一)——开篇

    最近在看尚硅谷的硅谷商城视频,想系统学习一下Android的商城开发流程,打算跟着视频的一步步做出一个商城,然后写博客总结记录一下整个商城的开发过程以及使用到的技术知识点,这个商城的最终效果如下图所示 ...

  3. Android商城开发系列(二)——App启动欢迎页面制作

    商城APP一般都会在应用启动时有一个欢迎界面,下面我们来实现一个最简单的欢迎页开发:就是打开商城App,先出现欢迎界面,停留几秒钟,自动进入应用程序的主界面. 首先先定义WelcomeActivity ...

  4. Android商城开发系列(十)—— 首页活动广告布局实现

    在上一篇博客当中,我们讲了频道布局的实现,接下来我们讲解一下活动广告布局的实现,效果如下图: 这个是用viewpager去实现的,新建一个act_item.xml,代码如下所示: 1 <?xml ...

  5. Android商城开发系列(九)—— 首页频道布局的实现

    在上一篇博客当中,我们讲了关于首页轮询广告的实现,接下来讲解一下首页频道布局的实现,如下图所示: 这个布局用的是gridview去完成的,新建一个channel_item,代码如下所示: 1 < ...

  6. android 字符串函数,Android JNI开发系列(六)字符串操作

    JNI字符串操作 字符串是引用数据类型,不属于基本数据类型 Java 使用unicode编码,C使用UTF-8,所以在操作中 C语言的字符串操作在头文件中 示例代码 public native Str ...

  7. Android商城开发----点击加入购物车,购物车商品的增删减

    Android商城开发----点击加入购物车,购物车商品的增删减 上一章节:[分类页面]点击左侧类别,实现右侧对应类别商品的展示 本文是在上一章节基础上开发的,点击[分类]页面商品的加入购物车按钮,实 ...

  8. Android蓝牙开发系列文章-扫不到蓝牙设备,你的姿势对了吗?

    在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出两篇文章,分别是: 关于蓝牙设备类型分类的,这个已经完成了,阅读请点击<Android蓝牙开发系列文章-蓝牙设备类型 ...

  9. Android蓝牙开发系列文章-蓝牙设备类型知多少?

    在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...

最新文章

  1. html 复选框 mysql_Html:实现带复选框的下拉框(一)
  2. 22张深度学习精炼图笔记总结(附原版下载)
  3. 我的Android笔记--我对安卓系统的一些了解
  4. 软件测试用例设计“八法归一”——因果阵
  5. ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式
  6. 线程中发送消息阻塞问题解决
  7. JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
  8. mysql增量备份实例_MySQL增量备份与恢复实例
  9. 三星Galaxy Note系列旗舰今年确定缺席:超万名粉丝请愿望其回归
  10. Python 安装 lxml 插件
  11. 基于node.js的express使用数据库时,解决异步调用的问题
  12. iconfont阿里矢量图标库使用说明
  13. 最好用的免费数据恢复软件下载
  14. c语言编写生日祝福语大全,最经典的生日祝福语(精选50句)
  15. 最热门的十种编程语言,总有一种适合你
  16. AGV (Automated guided vehicle)基础(一) - AGV的导航种类
  17. vue 仿豆瓣 爬坑之旅
  18. PDF如何在线压缩?PDF压缩到最小的方法
  19. win10自动重启另辟蹊径解决方案
  20. (c语言)通俗易懂的冒泡代码思路

热门文章

  1. Apollo 1 融合 Spring 的三个入口
  2. Json动态添加属性
  3. mongodb的架构 副本集搭建
  4. 中科曙光:与VMware合资公司是技术公司
  5. iOS.ReactNative-3-about-viewmanager-uimanager-and-bridgemodule
  6. Android JNI使用方法
  7. 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
  8. linux gnome_GNOME,生日快乐:喜欢这个Linux桌面的8个理由
  9. python 搜寻蓝牙_3 Python Web搜寻器和搜寻器
  10. devops 开发_开发五年,DevOps手册问世