前言
RetroHttp
作为一个基于Retrofit2.x
网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的文章里,我已经对RetroHttp
的使用做了些相关介绍,大家感兴趣的话可以参考以下文章:
RetroHttp(一) — 下载使用介绍
RetroHttp(二) — 下载支持增量更新
考虑到Java
与Kotlin
在写法上的差异,今天就来介绍下RetroHttp
之kotlin
版的网络通讯写法吧
今天涉及内容:
-
Retrofitor
的写法 -
ApiService
中通讯接口写法 -
Presenter
写法
一. Retrofitor 的写法
Retrofitor
一般是以单例的形式出现,以ApiRetrofitor
为例,则其kotlin
版本写法如下:
/**
* Title: 基本信息Retrofitor[单例模式]
* description:
* autor:pei
* created on 2020/9/23
*/
object ApiRetrofitor:BaseRetrofitor(){
private val RELEASE_URL = ""//正式
private val TEST_URL = ""//测试
override fun getReleaseUrl(): String {
return RELEASE_URL
}
override fun getTestUrl(): String {
return TEST_URL
}
}
二. ApiService 中通讯接口写法
一般在ApiService
中写接口的时候,都会利用泛型
尽量将返回参数范围缩小到最小,但是由于在kotlin
书写的过程中,便于在Presenter
中对返回数据的每个环节做细致处理,这里我就以最大范围接收数据了。以登录
为例,接口示例代码如下:
/**
* Title: 通讯接口
* description:
* autor:pei
* created on 2020/9/23
*/
interface ApiService{
//用户登录
@POST("my/user/login")
fun login(@Body user:RequestUser):Observable<ResponseData<Any>>
}
三. Presenter 写法
在整个网络通讯流程,Presenter
是起到至关重要的环节,还是以登录
为例,则LoginPresenter
代码如下:
/**
* Title: 登录
* description:
* autor:pei
* created on 2020/9/28
*/
class LoginPresenter : LoginContract.Presenter {
private var mContext: Context? = null
private var mView: LoginContract.View? = null
constructor(context: Context, view: PreView) {
this.mContext = context
this.mView = view as LoginContract.View
}
override fun attachView() {}
override fun detachView() {}
override fun login(userName: String, password: String) {
//组装参数
var user:RequestUser= RequestUser(userName,encryptPassword)
var apiService: ApiService =
ApiRetrofitor.getBaseRetrofitor<BaseRetrofitor>().apiService as ApiService
//发起请求
var observable: Observable<ResponseData<Any>> = apiService.login(user)
//显示加载dialog
LoadingDialog.getInstance().showLoading(mContext)
RxManager.connect(observable, object : ApiObserver<ResponseData<Any>>() {
override fun doNext(responseData : ResponseData<Any>) {
LoadingDialog.getInstance().hideLoading()
var code:Int=responseData.code
var message:String?=responseData.message
when(code){
ResponseCode.SUCCES_CODE ->{
var obj=responseData.data
if(obj!=null){
var userInfo:UserInfo = GsonUtil.gsonToBean(obj.toString(),UserInfo::class.java)
(mView as LoginContract.View).loginSuccess(userInfo)
}else{
(mView as LoginContract.View).loginFail("数据解析错误")
}
}
ResponseCode.FAILED_CODE ->{
(mView as LoginContract.View).loginFail(message!!)
}
}
}
override fun doError(e: ServerException?) {
LoadingDialog.getInstance().hideLoading()
var errorMessage: String? = e?.message ?: null
(mView as LoginContract.View).loginFail(errorMessage)
}
})
}
}
ok, 今天的内容就介绍到这里了,谢谢大家。
网友评论