Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据...
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解析数据...相关推荐
- Android商城开发系列
Android商城开发系列(一)--开篇 Android商城开发系列(二)--App启动欢迎页面制作 Android商城开发系列(三)--使用Fragment+RadioButton实现商城底部导航栏 ...
- Android商城开发系列(一)——开篇
最近在看尚硅谷的硅谷商城视频,想系统学习一下Android的商城开发流程,打算跟着视频的一步步做出一个商城,然后写博客总结记录一下整个商城的开发过程以及使用到的技术知识点,这个商城的最终效果如下图所示 ...
- Android商城开发系列(二)——App启动欢迎页面制作
商城APP一般都会在应用启动时有一个欢迎界面,下面我们来实现一个最简单的欢迎页开发:就是打开商城App,先出现欢迎界面,停留几秒钟,自动进入应用程序的主界面. 首先先定义WelcomeActivity ...
- Android商城开发系列(十)—— 首页活动广告布局实现
在上一篇博客当中,我们讲了频道布局的实现,接下来我们讲解一下活动广告布局的实现,效果如下图: 这个是用viewpager去实现的,新建一个act_item.xml,代码如下所示: 1 <?xml ...
- Android商城开发系列(九)—— 首页频道布局的实现
在上一篇博客当中,我们讲了关于首页轮询广告的实现,接下来讲解一下首页频道布局的实现,如下图所示: 这个布局用的是gridview去完成的,新建一个channel_item,代码如下所示: 1 < ...
- android 字符串函数,Android JNI开发系列(六)字符串操作
JNI字符串操作 字符串是引用数据类型,不属于基本数据类型 Java 使用unicode编码,C使用UTF-8,所以在操作中 C语言的字符串操作在头文件中 示例代码 public native Str ...
- Android商城开发----点击加入购物车,购物车商品的增删减
Android商城开发----点击加入购物车,购物车商品的增删减 上一章节:[分类页面]点击左侧类别,实现右侧对应类别商品的展示 本文是在上一章节基础上开发的,点击[分类]页面商品的加入购物车按钮,实 ...
- Android蓝牙开发系列文章-扫不到蓝牙设备,你的姿势对了吗?
在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出两篇文章,分别是: 关于蓝牙设备类型分类的,这个已经完成了,阅读请点击<Android蓝牙开发系列文章-蓝牙设备类型 ...
- Android蓝牙开发系列文章-蓝牙设备类型知多少?
在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...
最新文章
- html 复选框 mysql_Html:实现带复选框的下拉框(一)
- 22张深度学习精炼图笔记总结(附原版下载)
- 我的Android笔记--我对安卓系统的一些了解
- 软件测试用例设计“八法归一”——因果阵
- ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式
- 线程中发送消息阻塞问题解决
- JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
- mysql增量备份实例_MySQL增量备份与恢复实例
- 三星Galaxy Note系列旗舰今年确定缺席:超万名粉丝请愿望其回归
- Python 安装 lxml 插件
- 基于node.js的express使用数据库时,解决异步调用的问题
- iconfont阿里矢量图标库使用说明
- 最好用的免费数据恢复软件下载
- c语言编写生日祝福语大全,最经典的生日祝福语(精选50句)
- 最热门的十种编程语言,总有一种适合你
- AGV (Automated guided vehicle)基础(一) - AGV的导航种类
- vue 仿豆瓣 爬坑之旅
- PDF如何在线压缩?PDF压缩到最小的方法
- win10自动重启另辟蹊径解决方案
- (c语言)通俗易懂的冒泡代码思路
热门文章
- Apollo 1 融合 Spring 的三个入口
- Json动态添加属性
- mongodb的架构 副本集搭建
- 中科曙光:与VMware合资公司是技术公司
- iOS.ReactNative-3-about-viewmanager-uimanager-and-bridgemodule
- Android JNI使用方法
- 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
- linux gnome_GNOME,生日快乐:喜欢这个Linux桌面的8个理由
- python 搜寻蓝牙_3 Python Web搜寻器和搜寻器
- devops 开发_开发五年,DevOps手册问世