####点击查看上一篇文章:手把手教你如何搭建一个自己的安卓快速开发框架之BaseActivity(一)

继上一篇我实现了基本的BaseActivity,包含

  • ToolBar
  • 透明状态栏
  • 生命周期监控

那么,这一篇,我准备引入:

  • OkHttp 3.3.1(引用鸿洋的一个OkhttpUtil)
  • EventBus 3.0
  • Json解析
  • ButterKnife8.5.1

来完善我们的快速开发框架。

上次本来说这篇引入RXJava+retrofit,然后再引入MVP,但是突然发现过渡是不是有点太突然。
因此我准备循序渐进,慢慢深入,所以这次我们先用OKhttp+EventBus,去实现一次网络请求并完成界面异步更新。

####1、首先第一:明确我们服务返回的JSON数据格式:
我们暂且称为BaseData

      {"message": "ok","nu": "7700008953907","ischeck": "1","condition": "F00","com": "yunda","status": "200","state": "3","data": [{"time": "2017-02-14 19:14:27","ftime": "2017-02-14 19:14:27","context": "[陕西西安东郊区兴庆公园公司理工大分部]快件已被 已签收 签收","location": "陕西西安东郊区兴庆公园公司理工大分部"},{"time": "2017-02-12 23:26:15","ftime": "2017-02-12 23:26:15","context": "[上海分拨中心]进行装车扫描,即将发往:陕西西安分拨中心","location": "上海分拨中心"},{"time": "2017-02-12 23:21:52","ftime": "2017-02-12 23:21:52","context": "[上海分拨中心]在分拨中心进行称重扫描","location": "上海分拨中心"},]
}

####2、第二:我们有一个get请求的URL:
http://www.kuaidi100.com/query

有2个参数 type=yunda&postid=7700008953907。

####3、第三:
明确我们希望看到的请求方式:

  Ok_Request.getAsyncData(this, map, UrlUtil.GetKuaiDi, new MyStringCallBack() {@Overridepublic void onResponse(BaseData response, int id) {List<dataModel> resultlist= null;if (response != null) {resultlist=response.getData();}//EventBus.getDefault().post(resultlist);}

发送一次get请求,Map里面是我们需要提交的参数。 最后在onResponse方法中得到我们想要的返回结果response,它是通过BaseData做了一层封装的。

####4、第四:
请求结束,通过 EventBus.getDefault().post(resultlist);发送接收到的Json数据以供处理。并且通过dataEvent方法接收数据。ThreadMode.MAIN指定在主线程处理数据。

 @Subscribe(threadMode = ThreadMode.MAIN)public void dataEvent(List<dataModel> resultlist) {tv.setText(resultlist.toString());}

一次流程就这么走完了,但是从哪儿能看出我们这是一个框架呢?

1. BaseData

我们明确服务端的数据格式务必统一为BaseData,方便安卓端封装解析方法,直接返回需要的data字段。

2. getAsyncData

精简的请求方式,传入参数,URL,CallBack,在onresponse中处理结果即可。

3. BindView

所有界面省略繁琐的findviewById方法,采用ButterKnife注解生成,包括点击事件。


这里,第一和第三比较简单,第一点很必要,因为这直接决定了APP端的封装完整度和简洁度。第三点会用就行。所以,我们下来重点阐述第二点:

本来,OkhttpUtil的用法是这样的:

            OkHttpUtils.get().params(map).tag(mContext).url(url).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {}});

直接放到Activity中有以下几个缺点:

  • 每个页面都得写这样一段。
  • 如果一个页面3个请求就得写三个这样的代码段。
  • 突然OKhttpUtil出Bug了需要修改为Volley,难道每个页面都要改吗?!

因此,我们需要做个封装:

/*** Created by QHT on 2017-04-05.** GET,PUT等网络操作类*/
public class Ok_Request {public static MediaType JSON = MediaType.parse("application/json;charset=utf-8");/*** GET方式* 异步get请求* @param url*/public static void getAsyncData(Context mContext, HashMap<String,String> map,final String url, Callback callback) {OkHttpUtils.get().params(map).tag(mContext).url(url).build().execute(callback);}
}

在Activity中调用Ok_Request.getAsyncData方法传入一个匿名CallBack即可。如下:

 private static int Ok_count=2;HashMap<String, String> map = new HashMap<>();/*** 参数*/map.put("type", "yunda");map.put("postid", "7700008953907");
Ok_Request.getAsyncData(this, map, UrlUtil.GetKuaiDi, new MyStringCallBack() {/*** UI Thread*/@Overridepublic void onBefore(Request request, int id) {DialogUtil.showProgressDialog(MainActivity.this, true);}@Overridepublic void onAfter(int id) {--Ok_count;if(Ok_count==0){DialogUtil.hideProgressDialog();}}@Overridepublic void onError(Call call, Exception e, int id) {ToastUtil.showToastLong(e.getMessage());}@Overridepublic void onResponse(BaseData response, int id) {List<dataModel> resultlist= null;if (response != null) {resultlist=response.getData();}EventBus.getDefault().post(resultlist);}});

共四个回调方法onBefore,onAfter,onResponse,onError。

  • onBefore方法中我们显示一个dialog“加载中…”
  • onAfter方法中我们dismiss这个dialog
  • onResponse方法中处理服务端返回的数据
  • onError方法中进行异常处理

如上,我们已经完成了我们的网络请求。但是,如果我们一个页面不止一次请求呢,有两次呢?我们怎么控制dialog何时隐藏?

这个时候,我们就需要一个计数器Ok_count,在onAfter方法中执行Ok_count减一,并且判断Ok_count是否为0,若为0才允许隐藏dialog。(类似于同步计数器CountDownLatch类)


####说完了请求,下来我们来说说Json

默认情况下,Okhttp返回的数据为Response,那么我们就来一步一步写自己的解析方式:

请求结束之后,数据层首先执行parseNetworkResponse方法(此方法运行在子线程),返回一个Response,在这里,我们对需要的数据进行处理:

/*** Created by QHT on 2017-04-05.*/
public abstract  class MyStringCallBack  extends Callback<BaseData>{/*** Thread Pool Thread* @param response* @param id*/@Overridepublic BaseData parseNetworkResponse(Response response, int id) throws Exception {String temp=response.body().string();BaseData baseData = GsonUtils.jsonToModel(temp, BaseData.class);return baseData;}
}

解析的代码如下:

public static  <T> T jsonToModel(String json,Class<T> clazz) {if (TextUtils.isEmpty(json) || null == clazz) {return null;}try {return gson.fromJson(json, clazz);}catch (Exception e){e.printStackTrace();LogUtil.e("服务端接口json数据格式异常:"+e.getMessage());return null;}
  • 通过response.body().string()可以拿到返回的String。
  • 通过我们写好的Json解析类可以将String解析为我们最外层的BaseData。
  • 固定服务端返回数据格式的重要作用就在这儿(统一处理)

接下来,回调onResponse方法,参数为我们上面返回的BaseData,onResponse方法最后就变成了这样:

                @Overridepublic void onResponse(BaseData response, int id) {List<dataModel> resultlist= null;if (response != null) {resultlist=response.getData();}EventBus.getDefault().post(resultlist);}

要什么,在BaseData 中取什么就行。

下一篇,我准备开始完善功能了,加入:

  1. BaseFrament
  2. 微信底部4按钮切换
  3. 登录功能
  4. 快递追踪功能

最后,我将代码上传到github上,持续更新,逐渐完善这个简易框架。

我的QQ: 1003077897
我的csdn:http://blog.csdn.net/u012534831
我的github:https://github.com/qht1003077897
我的个人博客:https://qht1003077897.github.io

手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(二)相关推荐

  1. 手把手教你如何搭建一个网红教师的网络教学环境

    网络教学环境搭建 店铺地址:https://shop66907778.taobao.com/ 参考链接:https://blog.csdn.net/weixin_41486034/article/de ...

  2. 手把手教你免费搭建一个功能强大的小程序商城

    微信小程序近几年可谓是不可错过的一个时代风口,背靠微信10亿用户基数,小程序电商也日益蓬勃发展,不论是微信官方还是第三方开发者,都围绕小程序做了很多事情,包括我们每天扫一扫的健康码等都是用小程序做的, ...

  3. 知名图床程序chevereto双十一半价促销,手把手教你如何搭建一个属于自己的无限存储图床

    双十一chevereto打折了,半价促销,单站点15,多站点30,多站点30,多站点30可以持续更新使用最新版直到4.0.0版本为止,之后你可以继续选择旧版本,也可以加购使用新版本.3.X(LTS)版 ...

  4. 打赏平台怎么搭建,手把手教你怎么搭建一个服务行业微信打赏功能

    <div id="app"><p>{{ message }}</p> </div><script> new Vue({e ...

  5. 镜播无人直播带货教程,手把手教你如何搭建直播间

    镜播无人直播带货新手教程,手把手教你如何搭建直播间 如果你一个人在家里面直播,没有直播中控来辅助你一个情况下怎么办?来教你一个什么叫做镜播.用镜子来做一个直播的辅助.在你的面前放一面镜子,下面是产品, ...

  6. 闲置硬盘自制nas私有云_家里闲置硬盘怎么办?教你自己搭建一个私人云盘!

    原标题:家里闲置硬盘怎么办?教你自己搭建一个私人云盘! 最近在家比较闲,把家里之前电脑硬盘升级到固态硬盘的那个500G的机械硬盘翻出来,看看如何利用起来,在家里放着也是浪费.因为有好多个人资源需要,但 ...

  7. Ultimate++是一个C++跨平台应用快速开发框架

    Ultimate++是一个C++跨平台应用快速开发框架 U++是一个注重提高编程效率的C++跨平台应用快速开发框架,包括一系列库(GUI. SQL等)和一个集成开发环境. 快速开发是通过智能.主动使用 ...

  8. 手把手教你,搭建内网穿透服务

    我的 GitHub 仓库:? 手把手教你搭建内网穿透服务,基于 lanproxy 穿透服务,为你深度定制了开箱即用的服务端和客户端 Docker 镜像. 在很多场景下内网穿透都是我们常常遇到的需求,之 ...

  9. 【奥斯卡理财星体系 第五章】丨手把手教你从零开始搭建资产配置

    学习理财良久,依然没有头绪? 有没有简洁明了,循序渐进的课程,能够让我少走弯路,早日变为理财达人呢? 从一个完全的理财小白一路取经的奥斯卡,将手把手教你从零开始建立理财体系! [奥斯卡理财星体系 第五 ...

最新文章

  1. laravel + Vue 前后端分离 之 项目配置- 生产环境部署
  2. OPENCV背景细分background segmentation的实例(附完整代码)
  3. LiveVideoStack上海2019八折截止最后一周
  4. 《小团队构建大网站:中小研发团队架构实践》送书活动结果公布
  5. 专访图灵奖得主:完全自动驾驶是计算机接近人类智能的一大步
  6. java 当中的验证码_Java Web中验证码的实现
  7. 【2020模拟考试T3】【PAT乙】1028 人口普查 (20分) 字符串比较
  8. 海康威视摄像机修改网络参数报错:SADP.dll[2011]码
  9. tensorflow(一)windows 10 python3.6安装tensorflow1.4与基本概念解读
  10. 求无序数组的中位数(c语言版本)
  11. Microsoft visual studio关闭安全检查的几种方法(2015/2017)
  12. 第六篇,STM32脉冲宽度调制(PWM)编程
  13. Golang开发的CMS内容发布系统
  14. 基于matlab的多路BPSK调制—为什么采样率=码元速率x一个码元周期内对码元的采样点数
  15. dom4j解析dom示例
  16. 跳板机(运维堡垒主机)
  17. caffe中各个层——解析
  18. 利用python渲染IPsec配置
  19. Matlab实现Lagrange插值多项式
  20. 传奇私服服务器移动玩家位置,传奇私服服务端里面哪个是玩家数据文件文件

热门文章

  1. 【openbmc添加fru信息通过ipmitool命令读取】【后续】
  2. 死锁的原理以及避免算法
  3. 没有鼠标怎么还原计算机,系统恢复选项鼠标键盘不能用,鼠标没有右键功能
  4. 从FVM上线前的测试网统计报告中看前景,Filecoin将会迎来什么变化?
  5. upload-labs 第6-20关
  6. acme申请泛域名SSL证书
  7. kindeditor批量上传设置_亚马逊物流(FBA)全解析——如何在卖家平台完成FBA设置?...
  8. jquery的ajax的success和fail用法
  9. 自动装箱、拆箱了解多少?
  10. PowerDesigner概述