Android商城開發系列(六)——使用 OkHttpUtils 請求網絡 + 使用 fastjson解析數據

  OkHttp是Google推薦使用的一個開源的網絡請求框架,Android開發中涉及到網絡請求和接口調用如今大部分都是使用OkHttp,網上已經有很多人針對OkHttp進行了封裝,這裏推薦一下鴻洋大神的okhttputils,這是針對OkHttp進行的封裝,使用起來特別方便,下載地址:https://github.com/hongyangAndroid/okhttputils。java

  fastjson是一個針對json格式數據的解析處理框架,下載地址:https://github.com/alibaba/fastjson,Android端和服務端進行交互時,數據傳輸格式通常都採用JSON格式,對於JSON數據的解析,在Android端一般用gson解析,固然也能夠fastjson去解析數據,今天就來學習和總結一下如何使用fastjson去解析json格式數據。android

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

  配置以下:github

   compile 'com.zhy:okhttputils:2.6.2'json

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

  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配置纔會生效,以下圖:app

  

  接下來就可使用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解析數據就那麼多! 

相關文章
相關標籤/搜索