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的初始化工作,代码如下所示:

 package com.nyl.okhttputilstest;

 import android.app.Application;

 import com.zhy.http.okhttp.OkHttpUtils;

 import java.util.concurrent.TimeUnit;

 import okhttp3.OkHttpClient;

 /**
* 定义一个Application
*/ public class MyApplication extends Application{ @Override
public void onCreate() {
super.onCreate();
/**
* 初始化OkHttpUtils
*/
initOkHttpClient();
} private void initOkHttpClient() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000L, TimeUnit.MILLISECONDS) //链接超时
.readTimeout(10000L,TimeUnit.MILLISECONDS) //读取超时
.build(); //其他配置 OkHttpUtils.initClient(okHttpClient);
}
}

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

  

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

 package com.nyl.shoppingmall.home.fragment;

 import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import com.alibaba.fastjson.JSON;
import com.nyl.shoppingmall.R;
import com.nyl.shoppingmall.base.BaseFragment;
import com.nyl.shoppingmall.home.bean.ResultBeanData;
import com.nyl.shoppingmall.utils.Constans;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback; import okhttp3.Call; /**
* 首页Fragment
*/
public class HomeFragment extends BaseFragment implements View.OnClickListener { private final static String TAG = HomeFragment.class.getSimpleName(); private TextView tv_search_home;
private TextView tv_message_home;
private RecyclerView rv_home;
private ImageView ib_top;
//返回的数据
private ResultBeanData.ResultBean resultBean; @Override
public View initView() {
Log.e(TAG,"主页面的Fragment的UI被初始化了");
View view = View.inflate(mContext,R.layout.fragment_home,null);
//初始化布局控件
tv_search_home = (TextView) view.findViewById(R.id.tv_search_home);
tv_message_home = (TextView) view.findViewById(R.id.tv_message_home);
rv_home = (RecyclerView) view.findViewById(R.id.rv_home);
ib_top = (ImageView) view.findViewById(R.id.ib_top); //设置点击事件
ib_top.setOnClickListener(this);
tv_search_home.setOnClickListener(this);
tv_message_home.setOnClickListener(this);
return view;
} @Override
public void initData() {
super.initData();
Log.e(TAG,"主页面的Fragment的数据被初始化了"); //联网请求首页数据
getDataFromNet();
} private void getDataFromNet() {
String url = Constans.HOME_URL;
OkHttpUtils
.get()
.url(url)
.build()
.execute(new StringCallback()
{ /**
* 请求失败的时候回调
* @param call
* @param e
* @param id
*/
@Override
public void onError(Call call, Exception e, int id) { Log.e(TAG,"首页请求失败=="+e.getMessage());
} /**
* 当请求成功的时候回调
* @param response 请求成功数据
* @param id
*/
@Override
public void onResponse(String response, int id) { Log.e(TAG,"首页请求成功=="+response);
//解析数据
processData(response);
}
});
} private void processData(String json) {
       //使用FastJson去解析Json数据,将json字符串转换成一个ResultBeanData对象
ResultBeanData resultBeanData = JSON.parseObject(json,ResultBeanData.class);
resultBean = resultBeanData.getResult();
Log.e(TAG,"解析成功=="+resultBean.getHot_info().get(0).getName());
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.ib_top: //置顶的监听
rv_home.scrollToPosition(0);
break;
case R.id.tv_search_home: //搜索的监听
Toast.makeText(mContext,"搜索",Toast.LENGTH_SHORT).show();
break;
case R.id.tv_message_home: //消息监听
Toast.makeText(mContext,"进入消息中心",Toast.LENGTH_SHORT).show();
break;
}
}
}

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

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

 package com.nyl.shoppingmall.utils;

 /**
* 配置各个页面联网地址
*/ public class Constans { //首页路径
public static String HOME_URL = "http://192.168.1.108:8080/atguigu/json/HOME_URL.json";
}

  这里我使用的是我本地的服务器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类的代码如下所示:

 package com.nyl.shoppingmall.home.bean;

 import java.util.List;

 /**
* Created by Administrator on 2017/3/21 0021.
*/ public class ResultBeanData { /**
* code : 200
* msg : 请求成功
*
*/ private int code;
private String msg;
private ResultBean result; public void setCode(int code) {
this.code = code;
} public void setMsg(String msg) {
this.msg = msg;
} public void setResult(ResultBean result) {
this.result = result;
} public int getCode() {
return code;
} public String getMsg() {
return msg;
} public ResultBean getResult() {
return result;
} public static class ResultBean { private SeckillInfoEntity seckill_info;
private List<ActInfoEntity> act_info;
private List<BannerInfoEntity> banner_info;
private List<ChannelInfoEntity> channel_info;
private List<HotInfoEntity> hot_info;
private List<RecommendInfoEntity> recommend_info; public void setSeckill_info(SeckillInfoEntity seckill_info) {
this.seckill_info = seckill_info;
} public void setAct_info(List<ActInfoEntity> act_info) {
this.act_info = act_info;
} public void setBanner_info(List<BannerInfoEntity> banner_info) {
this.banner_info = banner_info;
} public void setChannel_info(List<ChannelInfoEntity> channel_info) {
this.channel_info = channel_info;
} public void setHot_info(List<HotInfoEntity> hot_info) {
this.hot_info = hot_info;
} public void setRecommend_info(List<RecommendInfoEntity> recommend_info) {
this.recommend_info = recommend_info;
} public SeckillInfoEntity getSeckill_info() {
return seckill_info;
} public List<ActInfoEntity> getAct_info() {
return act_info;
} public List<BannerInfoEntity> getBanner_info() {
return banner_info;
} public List<ChannelInfoEntity> getChannel_info() {
return channel_info;
} public List<HotInfoEntity> getHot_info() {
return hot_info;
} public List<RecommendInfoEntity> getRecommend_info() {
return recommend_info;
} public static class SeckillInfoEntity { private String end_time;
private String start_time;
private List<ListEntity> list; public void setEnd_time(String end_time) {
this.end_time = end_time;
} public void setStart_time(String start_time) {
this.start_time = start_time;
} public void setList(List<ListEntity> list) {
this.list = list;
} public String getEnd_time() {
return end_time;
} public String getStart_time() {
return start_time;
} public List<ListEntity> getList() {
return list;
} public static class ListEntity { private String cover_price;
private String figure;
private String name;
private String origin_price;
private String product_id; public void setCover_price(String cover_price) {
this.cover_price = cover_price;
} public void setFigure(String figure) {
this.figure = figure;
} public void setName(String name) {
this.name = name;
} public void setOrigin_price(String origin_price) {
this.origin_price = origin_price;
} public void setProduct_id(String product_id) {
this.product_id = product_id;
} public String getCover_price() {
return cover_price;
} public String getFigure() {
return figure;
} public String getName() {
return name;
} public String getOrigin_price() {
return origin_price;
} public String getProduct_id() {
return product_id;
}
}
} public static class ActInfoEntity { private String icon_url;
private String name;
private String url; public void setIcon_url(String icon_url) {
this.icon_url = icon_url;
} public void setName(String name) {
this.name = name;
} public void setUrl(String url) {
this.url = url;
} public String getIcon_url() {
return icon_url;
} public String getName() {
return name;
} public String getUrl() {
return url;
}
} public static class BannerInfoEntity { private String image;
private int option;
private int type;
private ValueEntity value; public void setImage(String image) {
this.image = image;
} public void setOption(int option) {
this.option = option;
} public void setType(int type) {
this.type = type;
} public void setValue(ValueEntity value) {
this.value = value;
} public String getImage() {
return image;
} public int getOption() {
return option;
} public int getType() {
return type;
} public ValueEntity getValue() {
return value;
} public static class ValueEntity {
/**
* url : /act20161111?cyc_app=1
*/ private String url; public void setUrl(String url) {
this.url = url;
} public String getUrl() {
return url;
}
}
} public static class ChannelInfoEntity {
/**
* channel_name : 服饰
* image : /app/img/menu-cyc.png
* option : 2
* type : 1
* value : {"channel_id":"8"}
*/ private String channel_name;
private String image;
private int option;
private int type;
private ValueEntity value; public void setChannel_name(String channel_name) {
this.channel_name = channel_name;
} public void setImage(String image) {
this.image = image;
} public void setOption(int option) {
this.option = option;
} public void setType(int type) {
this.type = type;
} public void setValue(ValueEntity value) {
this.value = value;
} public String getChannel_name() {
return channel_name;
} public String getImage() {
return image;
} public int getOption() {
return option;
} public int getType() {
return type;
} public ValueEntity getValue() {
return value;
} public static class ValueEntity {
/**
* channel_id : 8
*/ private String channel_id; public void setChannel_id(String channel_id) {
this.channel_id = channel_id;
} public String getChannel_id() {
return channel_id;
}
}
} public static class HotInfoEntity {
/**
* cover_price : 159.00
* figure : /1477984921265.jpg
* name : 现货【一方尘寰】剑侠情缘三剑三七秀 干将莫邪 90橙武仿烧蓝复古对簪
* product_id : 9356
*/ private String cover_price;
private String figure;
private String name;
private String product_id; public void setCover_price(String cover_price) {
this.cover_price = cover_price;
} public void setFigure(String figure) {
this.figure = figure;
} public void setName(String name) {
this.name = name;
} public void setProduct_id(String product_id) {
this.product_id = product_id;
} public String getCover_price() {
return cover_price;
} public String getFigure() {
return figure;
} public String getName() {
return name;
} public String getProduct_id() {
return product_id;
}
} public static class RecommendInfoEntity { private String cover_price;
private String figure;
private String name;
private String product_id; public void setCover_price(String cover_price) {
this.cover_price = cover_price;
} public void setFigure(String figure) {
this.figure = figure;
} public void setName(String name) {
this.name = name;
} public void setProduct_id(String product_id) {
this.product_id = product_id;
} public String getCover_price() {
return cover_price;
} public String getFigure() {
return figure;
} public String getName() {
return name;
} public String getProduct_id() {
return product_id;
}
}
}
}

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

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

  

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

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

Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据的更多相关文章

  1. Android商城开发系列(七)—— 使用RecyclerView展示首页数据

    前面我们讲到了使用OkHttp请求网络和FastJson解析数据了,接下来我们就开始把获取到的数据通过数据适配器展示在页面上了.Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合 ...

  2. Android商城开发系列(四)——butterknife的使用

    在上一篇博客:Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏实现商城的底部导航栏时,里面用到了butterknife,今天来讲解一下的butterk ...

  3. Android商城开发系列(十四)—— 设置监听RecyclerView的位置

    在前面的博客中有讲到过点击一个图片按钮控制RecyclerView的滚动到顶部位置的效果,但是那个图片按钮一直处在一个显示的状态,今天我们来改造一下那个地方,我们要实现的效果是:一开始打开的时候看不到 ...

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

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

  5. Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现

    今天我们来开发商城的首页[输入搜索框]布局和点击右下角图片回到顶部的效果 搜索功能在App中很常见,尤其是在商城类的项目当中,一般都会提供很强大的搜索功能,App的搜索布局一般都是在App的顶部,如下 ...

  6. Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏

    在商城第一篇的开篇当中,我们看到商城的效果图里面有一个底部导航栏效果,如下图所示: 今天我们就来实现商城底部导航栏,最终效果图如下所示:   那么这种效果是如何实现,实现的方式有很多种,最常见的就是使 ...

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

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

  8. Android商城开发系列(十三)—— 首页热卖商品布局实现

    热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: <?xml versio ...

  9. Android商城开发系列(十二)—— 首页推荐布局实现

    首页新品推荐的布局效果如下图: 这块布局是使用LinearLayout和GridView去实现,新建recommend_item.xml,代码如下所示: <?xml version=" ...

随机推荐

  1. windows下搭建nginx服务器及实现nginx支持https配置流程

    最近刚接触到了tomcat结合nginx做网站的负载均衡.之前对tomcat搭配nginx实现负载均衡也写过,在上一篇的博客中,最近遇到的问题是要在http的基础上支持https.也就是支持加密的请求 ...

  2. day11会话管理

    会话管理入门 2.1 生活中会话 我: 小张,你会跳小苹果码? 小张: 会,怎么了? 我: 公司年会上要表演节目,你教教我把 小张:没问题,一顿饭而已. 我: OK. ........ 在这次生活中的 ...

  3. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

  4. JS Guid生成

    function numToGuid(uid) { var str = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; var l = uid.to ...

  5. 小议Python3的原生协程机制

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在最近发布的 Python 3.5 版本中,官方正式引入了 async/await关键字.在 asyncio ...

  6. java反射机制应用之动态代理

    1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...

  7. gulp --watch直接退出,并没有监听

    1.在es6(彩票项目)搭建环境时遇到gulp --watch 只运行一次就退出了不能监听: D:\nodejs\es6-base>gulp --watch [::] Failed to loa ...

  8. ICPC 2016 China Final J. Mr.Panda and TubeMaster【最大费用最大流】

    有一种限制下界强制选的,但是也可以不用 把每个格点拆成两个,一个连s一个连t,对于不是必选的连中间连流量1费用0边表示不选,然后黑白染色,黑点连横着白点连竖着,边权就是这条水管的权值,然后跑最大费用最 ...

  9. openinstall的免费服务对App推广有哪些帮助?

    想在微信中下载 App,需要“点击右上角打开浏览器”,太麻烦: 想深入查看微信分享内容,需要手动打开 App 搜索,不方便: 想给 App 做推广,Android 需要多个渠道人工打包,效率低: .. ...

  10. CC05:基本字符串压缩

    题目 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变成"a2b1c5a3".若压缩后的字符串没 ...