【58】kotlin Retrofit 在项目中 的应用与封装

  • 基于okhttp封装的网络库。

  • 简单配置就能进行网络请求。

  • Rx完美结合。

官网地址:https://square.github.io/retrofit/

-官方文档介绍一共三部 第一步 自建service 第二步创建请求,第三步使用请求

下面是基于。本项目中的使用...有点小小小长 但是是从base类开始的以后可以参考这个案例

直接集成到你的项目中

新建包 如果下面已经有该包了就直接使用就好

新建包 common\

新建 BaseConstant  下面需要改成自己的业务域名哈。我这是随便写了一个

package com.anguo.baselibary.common

class BaseConstant {
    companion object{
        val  SERVER_ADDRESS="https://www.yzdyz.com"
    }}

 新建包 data/net

新建 RetrofitFactory

package com.anguo.baselibary.data.net

import com.anguo.baselibary.common.BaseConstant
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

class RetrofitFactory private constructor() {
    companion object {
        val instance: RetrofitFactory by lazy { RetrofitFactory() }
    }

    private val retrofit: Retrofit
    private val interceptor: Interceptor


    //初始化
    init {
        //通用拦截
        interceptor = Interceptor { chain ->
            val request = chain.request()
                .newBuilder()
                .addHeader("content-Type", "application/json")
                .addHeader("charset", "utf-8")
                .addHeader("appkey", BaseConstant.APP_KEY)
                .build()
            chain.proceed(request)
        }
        retrofit = Retrofit.Builder()
            .baseUrl(BaseConstant.SERVER_ADDRESS)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(initClient())
            .build()


    }

    private fun initClient(): OkHttpClient {
        return OkHttpClient.Builder()
            //日志拦截器
            .addInterceptor(initLogIntercepter())
            //请求拦截器
            .addInterceptor(interceptor)


            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .build()
    }

    private fun initLogIntercepter(): Interceptor {

        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        return interceptor
    }

    fun <T> create(service: Class<T>): T {
        return retrofit.create(service)
    }
}

新建包/data/protocal

新建BaseResp

package com.anguo.baselibary.data.protocal
/*
    能用响应对象
    @status:响应状态码
    @message:响应文字消息
    @data:具体响应业务对象
 */
class BaseResp<out T> (val status:Int,val message:String,val data:T)

新建包rx

新建 BaseException 用来回调请求错误的信息

package com.anguo.baselibary.rx

class BaseException(val status:Int,val msg:String):Throwable() {
}

base中得完成了。。下面是实际业务中需要的逻辑

UserCenter 模块

新建包 service/impl

新建 UserServiceImpl

import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.baselibary.rx.BaseException
import com.anguo.user.repinsitory.UserRepository
import com.anguo.user.service.UserService
import rx.Observable
import rx.functions.Func1

class UserServiceImpl : UserService {
    override fun register(email: String, userName: String,pwd: String): Observable<Boolean> {
        val reponsitory = UserRepository()
        return reponsitory.register(email, userName, pwd).flatMap(object :
            Func1<BaseResp<String>, Observable<Boolean>> {
            override fun call(t: BaseResp<String>?): Observable<Boolean> {
                if (t != null) {
                    if (t.status != 0) {
                        return Observable.error(BaseException(t.status,t.message))
                    }
                }
                return Observable.just(true)
            }
        })
    }
}


新建包 service

新建 UserService

package com.anguo.user.service

import rx.Observable

interface UserService {
    fun register(moible: String, verifyCode: String, pwd: String):Observable<Boolean>
}

新建包 repinsitory

新建 UserRepository

package com.anguo.user.repinsitory

import com.anguo.baselibary.data.net.RetrofitFactory
import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.user.data.api.UserApi
import com.anguo.user.data.protocal.RegisterReq
import rx.Observable

class UserRepository {
    fun register(email: String, userName: String,pwd: String): Observable<BaseResp<String>> {
       return RetrofitFactory.instance.create(UserApi::class.java)
            .register(RegisterReq(email,userName,pwd))
    }
}

新建包 data/api/

新建 UserApi  这里对应到得RegisterReq

package com.anguo.user.data.api

import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.user.data.protocal.RegisterReq
import retrofit2.http.Body
import retrofit2.http.POST
import rx.Observable
interface UserApi {
    @POST("login/register.php")
    fun register(@Body req: RegisterReq):Observable<BaseResp<String>>
}

 

新建包 data/protocal

新建 RegisterReq

package com.anguo.user.data.protocal

data class RegisterReq(val email:String, val username:String, val password:String)

马上好。。还有两次呢个

新建 包 present/view

新建 RegisterView

package com.anguo.user.present.view

import com.anguo.baselibary.presenter.view.BaseView

 interface RegisterView:BaseView {
     fun onRegisterResult(result:Boolean){
     }

}

新建包  present

新建  RegisterPersenter

 

package com.anguo.user.present

import UserServiceImpl
import com.anguo.baselibary.ext.execute
import com.anguo.baselibary.presenter.BasePresenter
import com.anguo.baselibary.rx.BaseSubscriber
import com.anguo.user.present.view.RegisterView

class RegisterPersenter : BasePresenter<RegisterView>() {
    fun register(email: String, userName: String,pwd: String) {
        /*业务逻辑*/
        val userService=UserServiceImpl()
        userService.register(email,userName,pwd)
            .execute(object : BaseSubscriber<Boolean>(){
                override fun onNext(t: Boolean) {
                    mView.onRegisterResult(t)
                }
            })


    }

}

在实际的页面中

package com.anguo.user.ui.activity

import android.os.Bundle
import com.anguo.baselibary.ui.activity.BaseMvpActivity
import com.anguo.user.R
import com.anguo.user.present.RegisterPersenter
import com.anguo.user.present.view.RegisterView
import kotlinx.android.synthetic.main.activity_register.*
import org.jetbrains.anko.toast


class RegisterActivity : BaseMvpActivity<RegisterPersenter>(), RegisterView {

    override fun onRegisterResult(result: Boolean) {
        toast("注册成功")
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)
        mPersenter = RegisterPersenter()
        mPersenter.mView = this;
        bt_ar_next.setOnClickListener {
//            mPersenter.register(
//                edArUsername.text.toString(),
//                edEmail.text.toString(),
//                edArPassword.text.toString()
//            );
            mPersenter.register(
                "137709378222@qq.com",
                "137709378222@qq.com",
               "123456"
            );
        }
    }
}

费劲啊。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值