Android Bullt 介绍5 -网络请求,敏捷到不剩底裤

项目地址:https://github.com/openVS-liu/AndroidBulletMvp

#网络请求-敏捷到不剩底裤
###简介
  RequestClient网络请求使用的是okhttp的同步请求方式+kotlin的协程技术。真正的请求运行在cup的共享线程中,不需要再app中创建请求线程池和请求线程。从而节省了网络请求的线程开销并且提高了程序的运行性能。通过对重复流程的代码进行封装从而大大减少代码量,使得程序员可以只关心核心业务处理,不需要过多关心错误处理。从而大幅提升开发效率。

使用示例:一次完整的http/https请求

 //this是Container接口,提供了请求的错误处理、以及请求的生命周期管理等方法。 
//  fragment、activity,presenter都实现了Container接口,  所以在什么地方发起网络请求 ,都可以方便的使用"this"    
            StructRequestClient.with(this) 
 //设置请求的url   
             .setUrl("/apis/CityCode/")
 //添加参数,可以添加多个
            .addParameter("code", "13")
 //设置需要把json中的data节点解析成什么类型的对象,程序会根据json数据是对象或者是 array自动判断需要解析成单个对象或者解析成List                                                
            .setTargetObjectClass(City::class.java) // 规定了请求到的json数据的指定节点要解析成什么对象,
            .setOnSuccessListener { targetObject, _ ->
//targetObject是解析结果,直接用于业务处理即可。
                view.displayCity(targetObject as List<City>)    
            }
       //发送请求
            .sendRequest()
  }
 

  没错,就是这么简单,一次网络请求就完成了。您关心的网络出错怎么处理? 请求数据异常怎么处理?下面的段落将详细解惑。

###错误处理机制
  View(Acitivity/Fragment)都已经实现了Container接口,间接实现了OnFinishListener、OnBreachAgreementListener、OnFailListener接口来处理网络请求结束、异常情况json( 比如约定好json中code节点值等于0为正常情况,但是实际返回的是非0的值)、请求出错等情况。Presenter也实现了Container接口。通过代理模式,实际执行的是View中对应的方法。
  当json数据不符合规范的时候程序自动调用OnBreachAgreementListener的相关方法,默认处理是弹出alert,显示出错原因,当请求出错时程序自动调用OnFailListener相关方法,默认实现是显示出错页面,页面包含一个指定id的重试按钮,点击button后会重新尝试请求网络。当遇到特需需求需要自行处理错误时可以调用RequestClient对象的
setOnBreachAgreementListener(OnBreachAgreementListener listener)和 setOnFailListener(OnFailListener listener)方法设置对象的回调接口。设置了自定义回调接口后,默认的处理方式就会失效,会被自定义接口拦截覆盖。

###根据自己实际业务需求封装自己的RequestClient

  BullectMVP架构的http网络模块基于okhttp3.x进行二次封装,架构提供抽象类RequestClient处理网络请求。使用此架构时需要继承RequestClient类并重写protected abstract Request createRequest()来创建Request对象(包含加密、设置公共参数、公共Header参数等待),需要重写 protected abstract Parser getParser()方法订制自己的Json解析器,需要重写 protected abstract String getServerUrl()返回请求server的url。具体订制方法可以参考demo中的StructRequestClient。
###RequestClient提供的常用方法

方法定义方法解释
RequestClient addHeader(String key, String value)添加请求头
RequestClient addParameter(String key, String value)$添加请求参数
RequestClient setTargetObjectClass(Class<?> targetObjectClass)设置需要把数据解析成那个Class的对象。在demo中的SructParser中,会把{“status”:0,data:{},“msg”:""}或者{“status”:0,data:{},“msg”:""}格式的json字符串中data节点解析为targetObjectClass对象或者targetObjectClass类型的List(程序会根据节点是object或者array自动判断应该解析成对象还是list)
RequestClient addNodeObjectClass(String nodeName, Class<?> targetObjectClass)设置指定的子节点解析为特定类型的对象,并在回调中的map中通过nodeName获取结果。
RequestClient setLogTag(String tag)设置打印日志的tag,通过此tag可以在logCat中过滤本次网络请求的日志,不设置tag则不打印日志
RequestClient setLogEnable(boolean logEnable)设置是否可以打印日志,设置true并且setLogTag(String tag)中tag isEmpty()==false时会打印日志
void sendRequest()发送请求
RequestClient setOnFailListener(OnFailListener listener)设置请求失败的回调
RequestClient setOnSuccessListener(OnSuccessListener listener)设置请求成功的回调
RequestClient setOnFinishListener(OnFinishListener listener)设置请求结束的回调监听,无论请求是否成功都会调用此回调
RequestClient setOnFinishListener(OnFinishListener listener)设置请求结束的回调监听,无论请求是否成功都会调用此回调
RequestClient setOnBreachAgreementListener(OnBreachAgreementListener listener)设置请求到的数据,不符合协议的回调监听。例如{“status”:0,data:{},“msg”:""}格式的数据,约定了只有status==0时时正常请求,否则都是异常不符合协议的情况。此时会吧statue值和msg异常详情回调给业务代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值