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. InetAddress 类简介

    package javanet; import java.net.InetAddress; import java.net.UnknownHostException; public class dem ...

  2. python3-----反射实例

    #/usr/bin/env python # -*- coding:utf-8 -*- import sys,os class WebServer(object): def __init__(self ...

  3. java&nbsp;Class类

    java Class类 Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a ru ...

  4. UVa 11404 Palindromic Subsequence (LCS)

    题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...

  5. LeetCode: 389 Find the Difference(easy)

    题目: Given two strings s and t which consist of only lowercase letters. String t is generated by rand ...

  6. NHibernate 打不开工厂有可能是这几个原因

    1. 属性必须虚拟化. 2.属性必须要有Id 字段 3.数据库必须要是创建好的数据库.

  7. Automake使用说明

    说明 从零开始编写automake工程非常复杂也没有必要,我们只要能看懂开源项目的automake即可,然后根据自己实际情况进行修改即可,下面给出两个比较好的参考项目,其中spice-gtk涵盖了使用 ...

  8. Python:asyncio模块学习

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  9. UE4 c++ 创建刚体Cube

    1 新建一个Actor,一会用蓝图继承这个 TCubeActor.h #pragma once #include "CoreMinimal.h" #include "Ga ...

  10. AcDbHelix Demo

    AcDbObjectPointer<AcDbHelix> aHelix; aHelix.create(); aHelix->setAxisPoint(AcGePoint3d(, , ...