[TOC]
概述
前面我们介绍了如何使用Gson解析和创建json,这里我们继续介绍如何使用泛型来封装服务器回调。
本文主要的技术点有
- 使用类的泛型和方法的泛型
- 结合gson封装服务器json回调
1 建立通用的回调Model
以这个服务器回调为例。
|
|
这个json里面server_time
和success
的类型是固定不变的,但是data的类型却会经常改变,比如这里传回来的是User
,另一个接口传回来的可能就是Student
了。
首先建立对应的类:
|
|
2 封装服务器回调
这里我们写的服务器回调是基于已经拿到服务器回调的json字符串。
2.1 回调的抽象基类:
|
|
这里定义了一个构造方法,两个抽象方法,我们先看构造方法,
|
|
Type: Java中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
getGenericSuperclass()获得带有泛型的父类: 获得带有泛型的父类。
ParameterizedType: 参数化类型,即泛型。
getActualTypeArguments:获取参数化类型的数组,泛型参数可能有多个
getActualTypeArguments()[0]
得到了泛型的第一个参数T的类型,赋值给代表当前类泛型类型的成员变量genericityType
。如果不是参数化类型,比如在接收服务器回调的地方没有加泛型类型,那么我们就给genericityType
赋值Object的class对象。
genericityType
是用来在后面作为Gson解析的类型参数的。
再来看看抽象方法:
|
|
聪明的你一定发现了没有onSuccess()
,别急,看到后面你就明白了。onResolve()
就是用来解析json的了,子类需要重写它来具体解析。onFailed
是错误回调。
2.2 针对刚才服务器对象封装的抽象子类
|
|
首先,我们定义了一个抽象的带两个类型参数的泛型类,第一个参数是Gson
映射的外层对象,比如可以传入我们刚才定义的ServerCallbackModel
,第二个参数就是外层对象中的数据了,比如ServerCallbackModel
中的data。
然后来分析下类中的方法,先来看看非抽象的方法:
|
|
这个方法用来解析服务器回调,参数json就是服务器回调的json字符串。
首先判断泛型类型genericityType
是不是Class
类型的,然后判断genericityType
的名字是否为String
或者Object
,是则直接在成功回调中传入json字符串。
如果不是,则用Gson将json解析出来,实参就是genericityType
。此时解析出来的类型如果是我们刚才定义的ServerCallbackModel
,如果服务器返回成功,那就将data返回,data的类型就是这个类的第二个类型参数,也是onSuccess
的形参类型,我们最终需要的数据。
如果服务器返回失败,会将错误传递给onFailed。
|
|
这个方法主要是拦截错误,用于统一处理所有请求的错误。默认只判断是否需要直接弹toast显示错误信息。
|
|
我们可以考虑是否直接将错误信息弹窗提示出来,只需要重写enableShowToast
方法,返回true
即可。
再来看看抽象方法,这个就是我们最终在具体的业务层需要重写的方法了。
|
|
服务器返回成功的信息后,数据会传递到这里。
|
|
错误经过onFailed
拦截后,会传递到这里。
3 使用封装的回调
|
|
刚才你看到ServerCallback可能还不理解为什么这个泛型要有两个参数,看到这里你应该就秒懂了,其实服务器传回来的正确错误什么的,我们并不想每个调用的地方都去判断,我们这里想要的只是最终的数据。
本文的Demo地址是我的一个开源库,这个库已经经过了我们公司产品大量用户的考验,欢迎star
和fork
,也欢迎大家提issue
。
RetrofitClient: https://github.com/Jadyli/RetrofitClient
里面的封装基本都是按照本文的思路写的,当然也可以有所变化,比如有些接口没有success之类的,直接就是上数据,那就可以使用CommonCallback。