用Kotlin编写Android:Retrofit+Rxjava尝试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38364803/article/details/83659848

前言: 最近学习了安卓开发谷歌推荐的Kotlin语言,便用来尝试了一下重构之前的MVP+Retrofit+Rxjava的代码,下面是我重构后的Kotlin代码

首先添加gradle的compile:

dependencies {
    compile 'io.reactivex.rxjava2:rxjava:2.0.7'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.okhttp3:okhttp:3.5.0'
    }

顺便记录一下最近Android Studio3.0的jar包问题:
在这里插入图片描述

解决方法:
    androidTestCompile('com.android.support:support-annotations:26.1.0') {
        force = true
    }

然后讲一下Rxjava+retrofit开发:

步骤1: 创建 接收服务器返回数据 的类
class BaseBean<T> {
    private var code: Int = 0//返回码
    private var msg: String? = null//返回的信息
    private var data: T? = null//返回的数据

    fun getCode(): Int {
        return code
    }
    /**
     * 判断是否请求码成功
     */
    fun isSuccess(): Boolean {
        return this.code == GlobalContent.SUCCESS_CODE
    }

    fun getMsg(): String? {
        return msg
    }

    fun getData(): T? {
        return data
    }
}
步骤2:创建 用于描述网络请求 的接口
interface LoginService {
    @FormUrlEncoded
    @POST("manager/login")
   fun submitLoginInfo(@Field("username") String username,@Field("password") String password):Observable<BaseBean<String>> ;
}
步骤3:创建Retrofit对象,创建 网络请求接口 的实例

在Model层创建

    /**
     * 创建Service
     */
    fun <T> createService(service: Class<T>): T? {

        checkService(service)

        return RetrofitFactory.getService(service)
    }
        /**
     * 检验参数Service
     * @param service
     * @param <T>
    </T> */
    private fun <T> checkService(service: Class<T>?) {
        if (service == null)
            throw NullPointerException("service must not be null!")
        if (!service.isInterface)
            throw IllegalArgumentException("Class must be interface !")
        if (service.interfaces.size > 0)
            throw IllegalArgumentException("service interfaces must not extends other interface!")

    }
    /**
     * 工厂设计模式:创建单例设计的Retrofit对象
     */
object RetrofitFactory {
    var mRetrofit: Retrofit? = null

    fun <T> getService(service: Class<T>): T? {
        if(mRetrofit ==null) {
            synchronized(RetrofitFactory::class) {
                if (mRetrofit == null) {
                    mRetrofit = Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                            .addConverterFactory(GsonConverterFactory.create())
                            .baseUrl(GlobalContent.BASEURL)
                            .build()
                }
            }
        }

        return mRetrofit?.create(service)
    }
}
    /**
     * Model层实现创建网络请求接口的实例
     */
class LoginModel:BaseModel,ILoginModel {
     var mService:LoginService = this.createService(LoginService.class);
    
 Override fun submitLoginInfo(String username, String password): Observable<BaseBean<String>>  {
        return mService.submitLoginInfo(username, password).compose(this.<BaseBean<String>>setThread());
    }
}

步骤4:采用Observable<…>形式 对 网络请求 进行封装,发送网络请求

在Model层创建

    /**
     * 设置线程的切换
     */
    fun <T> setThread(): ObservableTransformer<T, T> {
        return ObservableTransformer { upstream ->
            upstream.subscribeOn(Schedulers.io())// 在IO线程进行网络请求
                    .observeOn(AndroidSchedulers.mainThread())//回到主线程 处理请求结果
        }
    }

在Presenter层

abstract class BasePresenter<T : IView> : IPresenter<T> {
    protected var mView: T? = null


   override fun attachView(view: T?) {
        this.mView = mView
    }

    override fun detachView() {
        if (this.mView != null) {
            mView = null
        }
    }

    override fun getView(): T? {
        return this.mView
    }
}

/**
 * 利用一个抽象类继承BasePresenter来定义与Model层连接的方法,实现与View连接的接口,并在实现类调用方法和回调接口
 */

abstract class AbstractLoginPresenter:BasePresenter<ILoginView>{
	abstract fun submitLoginInfo(String username,String password)
}

实现类Presenter

class LoginPresenter:AbstractLoginPresenter{
	private var mModel:IloginModel? = null
	constructor(){
	mModel = LoginModel()
	}
	override fun submitLoginInfo(String username, String password){
		mModel.submitLoginInfo(username,password)
			.subscribe(BaseObserver<String>() {
			override protected fun onFail(Throwable e){}
			override protected fun onSuccess(String data) {
                        getView().onLoginSuccess(data);
                    }
            override fun onCodeError() {
                        super.onCodeError();
                        getView().onLoginFail();
                    }
                })
    }
}

这样基本就可以实现一个简单的Retrofit 与 RxJava联合使用

猜你喜欢

转载自blog.csdn.net/weixin_38364803/article/details/83659848