版权声明:本文为博主原创文章,未经博主允许不得转载。 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联合使用