zoukankan      html  css  js  c++  java
  • 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解析数据就那么多! 

  • 相关阅读:
    POJ 1182 食物链(带权并查集)
    UVa 10655 n次方之和(矩阵快速幂)
    2016湘潭邀请赛—Heartstone
    2016湘潭邀请赛—Gambling
    UVa 10375 选择与除法(唯一分解定理)
    UVa 1637 纸牌游戏(全概率公式)
    POJ 2443 Set Operation(压位加速)
    UVa 11248 网络扩容(最大流(需要优化))
    51Nod 1737 配对(树的重心)
    51Nod 1070 Bash游戏 V4(斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/nylcy/p/6595263.html
Copyright © 2011-2022 走看看