美文网首页
RetroHttp(三) — kotlin版网络请求

RetroHttp(三) — kotlin版网络请求

作者: 奔跑的佩恩 | 来源:发表于2020-11-21 08:03 被阅读0次

前言

RetroHttp作为一个基于Retrofit2.x网络请求的封装库,致力于简洁快速的实现网络通讯,在之前的文章里,我已经对RetroHttp的使用做了些相关介绍,大家感兴趣的话可以参考以下文章:
RetroHttp(一) — 下载使用介绍
RetroHttp(二) — 下载支持增量更新
考虑到JavaKotlin在写法上的差异,今天就来介绍下RetroHttpkotlin版的网络通讯写法吧

今天涉及内容:

  1. Retrofitor的写法
  2. ApiService中通讯接口写法
  3. 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, 今天的内容就介绍到这里了,谢谢大家。

相关文章

网友评论

      本文标题:RetroHttp(三) — kotlin版网络请求

      本文链接:https://www.haomeiwen.com/subject/hzijiktx.html