快速搭建 Kotlin+MVP+RxJava+Retrofit+EventBus 的框架,方便快速开发新项目、减小开发成本,让所写的代码更加简洁,让开发者只须要关注业务的实现。java
BaseActivity
、 BaseFragment
是抽象类,封装了布局文件 ID
、初始化 View
、初始化数据、开始请求、是否使用 EventBus
、状态栏等;BaseMvpActivity
、 BaseMvpFragment
分别继承 BaseActivity
和 BaseFragment
并实现了 IView
接口,将 MVP
基础架构封装起来;注:若是想使用 MVP
架构就继承 BaseMvpActivity
或者 BaseMvpFragment
,若是不适用 MVP
架构就继承 BaseActivity
或者 BaseFragment
;BaseMvpTitleActivity
继承 BaseMvpActivity
,简单了封装了 Toolbar
,可扩展 。loge
、 showToast
、 showSnackMsg
、ss
、 sss
等通用方法,项目中能够直接调用;ss
、 sss
,这两个方法主要是对网络请求的统一封装,使用起来很是方便(亮点);mModel?.getBanners()?.ss(mModel, mView) {
mView?.showBanners(it.data)
}
addDisposable(
mModel?.getBanners()?.sss(mView) {
mView?.showBanners(it.data)
}
)
复制代码
这里贴上
ss
和sss
方法的代码(这两个方法用起来真的太爽了):git
fun <T : BaseBean> Observable<T>.ss(
model: IModel?,
view: IView?,
isShowLoading: Boolean = true,
onSuccess: (T) -> Unit
) {
this.compose(SchedulerUtils.ioToMain())
.retryWhen(RetryWithDelay())
.subscribe(object : Observer<T> {
override fun onComplete() {
view?.hideLoading()
}
override fun onSubscribe(d: Disposable) {
if (isShowLoading) {
view?.showLoading()
}
model?.addDisposable(d)
if (!NetWorkUtil.isConnected()) {
view?.showDefaultMsg("当前网络不可用,请检查网络设置")
d.dispose()
onComplete()
}
}
override fun onNext(t: T) {
when {
t.errorCode == ErrorStatus.SUCCESS -> onSuccess.invoke(t)
t.errorCode == ErrorStatus.TOKEN_INVAILD -> {
// Token 过时,从新登陆
}
else -> view?.showDefaultMsg(t.errorMsg)
}
}
override fun onError(t: Throwable) {
view?.hideLoading()
view?.showError(ExceptionHandle.handleException(t))
}
})
}
复制代码
fun <T : BaseBean> Observable<T>.sss(
view: IView?,
isShowLoading: Boolean = true,
onSuccess: (T) -> Unit
): Disposable {
if (isShowLoading) {
view?.showLoading()
}
return this.compose(SchedulerUtils.ioToMain())
.retryWhen(RetryWithDelay())
.subscribe({
when {
it.errorCode == ErrorStatus.SUCCESS -> onSuccess.invoke(it)
it.errorCode == ErrorStatus.TOKEN_INVAILD -> {
// Token 过时,从新登陆
}
else -> view?.showDefaultMsg(it.errorMsg)
}
view?.hideLoading()
}, {
view?.hideLoading()
view?.showError(ExceptionHandle.handleException(it))
})
}
复制代码
RetrofitFactory
来构建不一样 baseUrl
的 RetrofitService
(注:项目中 baseUrl 不少的状况下,不建议使用,建议从新封装) ;cookie
相关、统一的异常处理、 CacheInterceptor
、 HeaderInterceptor
、 SaveCookieInterceptor
等;RetryWithDelay
。object MainRetrofit : RetrofitFactory<MainApi>() {
override fun baseUrl(): String = Constant.BASE_URL
override fun getService(): Class<MainApi> = MainApi::class.java
}
interface MainApi {
@GET("/banner/json")
fun getHomeBanner(): Observable<HttpResult<MutableList<Banner>>>
}
复制代码
MVP 便是 Model , View , Presenter 三层,把 Activity 中的 UI 逻辑抽象成 View 接口,把业务逻辑抽象成 Presenter 接口, Model 类仍是原来的 Model ,实现了 Model 层和 View 层彻底解耦。github
用户触发 V 层事件, V 层把事件通知 P 层, P 层通知 M 层处理这个事件, M 层处理完以后把结果发送给 P 层, P 层再发送给 V 层,最后 V 层作出相应的处理,这是 MVP 架构的一整套流程。json
Activity
、 Fragment
、 Dialog
、 ViewGroup
等呈现视图的组件均可以承担该角色;A. 优势bash
模块职责划分明显,层次清晰,接口功能清晰;服务器
Model层和View层分离,解耦.修改 View
而不影响 Model
;cookie
功能复用度高,方便.一个 Presenter
能够复用于多个 View
,而不用更改 Presenter
的逻辑;网络
有利于测试驱动开发,之前的 Android
开发是难以进行单元测试;架构
若是后台接口还未写好,但已知返回数据类型的状况下,彻底能够写出此接口完整的功能。框架
B. 缺点
MVP
中接口过多;
每个功能,相比于 MVC
要多写好几个文件;
若是某一个界面中须要请求多个服务器接口,这个界面文件中会实现不少的回调接口,致使代码繁杂;
若是更改了数据源和请求中参数,会致使更多的代码修改;
额外的代码复杂度及学习成本。
SchedulerUtils
工具类、 IoMainScheduler
等;BaseObserver
和 BaseSubscriber
对 ResourceObserver
和 ResourceSubscriber
通用封装。Preference
类,主要采用了 kotlin
委托属性和 SharedPreference
的实例;StatusBarUtil
(适配状态栏) 、 KeyBoardUtil
(键盘相关) 、 NetWorkUtil
(网络相关) 、 RomUtil
(手机ROM相关) 、 FileProvider7
(7.0手机文件适配) 等。Toast
、 LoadingView
和 OnNoDoubleClickListener
(防止连续点击)。只须要五步就能够实现 MVP 架构。
Clone or Download
后导入baselibs
库,再根据需求自行修改便可。
须要定义一个 Contract
接口,来抽象 View
、Presenter
、Model
的方法,而且它们须要分别继承 IView
、IPresenter
、IModel
接口。
案例: MainContract
interface MainContract {
interface View : IView {
fun showBanners(banners: MutableList<Banner>)
}
interface Presenter : IPresenter<View> {
fun getBanner2()
}
interface Model : IModel {
fun getBanners(): Observable<HttpResult<MutableList<Banner>>>
}
}
复制代码
案例: MainModel
class MainModel : BaseModel(), MainContract.Model {
override fun getBanners(): Observable<HttpResult<MutableList<Banner>>> {
return MainRetrofit.service.getHomeBanner()
}
}
复制代码
案例: MainPresenter
class MainPresenter : BasePresenter<MainContract.Model, MainContract.View>(), MainContract.Presenter {
override fun createModel(): MainContract.Model? = MainModel()
override fun getBanner2() {
mModel?.getBanners()?.ss(mModel, mView) {
mView?.showBanners(it.data)
}
}
}
复制代码
案例:MainActivity
class MainActivity : BaseMvpTitleActivity<MainContract.View, MainContract.Presenter>(), MainContract.View {
override fun attachChildLayoutRes(): Int = R.layout.activity_main
override fun createPresenter(): MainContract.Presenter = MainPresenter()
override fun initView() {
}
override fun initData() {
}
override fun start() {
mPresenter?.getBanner2()
}
override fun showBanners(banners: MutableList<Banner>) {
tv_result.text = banners.toString()
}
}
复制代码
至此, Kotlin
基础框架已经搭建完成,若有错误之处还请指正。
完整的项目地址:github.com/iceCola7/Ko…。