开源软件名称(OpenSource Name):Taonce/Kotlin-MVP开源软件地址(OpenSource Url):https://github.com/Taonce/Kotlin-MVP开源编程语言(OpenSource Language):Kotlin 95.5%开源软件介绍(OpenSource Introduction):Kotlin-RxJava-Retrofit这段时间在写基于gank API客户端Demo的时候,尝试着封装了一把MVP,下面就来谈谈这整个过程中的一些感想。 MVP说起MVP,大家都是熟悉的不能再熟悉的了,但是要封装一套好的MVP还是很有必要的,可以很快捷的开发项目。下面谈谈我对MVP的理解吧。 View层:取数据和显示界面,问P层索要数据,在界面上显示数据。 Presenter层:把View需要的操作传递给Model层,然后Model层处理完复杂操作之后通过P层来把结果传递给View层。 Model层:P层让我干什么我就干什么,有什么用和怎么用不需要管,只管处理,然后把处理后的结果回调给P层。 了解了三者的基本关系之后,接着来看看具体如何封装属于自己的MVP结构。我这里是按照自己的需求,大家仅供参考! Demo整体结构如下: 整个项目按照上图结构设计。 下面介绍两个比较重要的地方: IBaseView: 其中 interface IBaseView{
fun showLoading()
fun hideLoading()
} 当我们在实现具体 interface IMainView : IBaseView {
fun showAndroidData(bean: AndroidBean)
fun showErrorMsg(msg: String = "亲,网络出现问题了哦~")
} 这是demo中的一个,另外定义了两个方法,一个是展示获取的Android数据,还有一个就是获取数据失败的方法。显示和隐藏进度条就交给 BasePresenter: 而 package com.taonce.kotlindemo.base
open class BasePresenter<V> {
private var view: V? = null
// 绑定View
fun attachView(view: V) {
this.view = view
}
// 解绑
fun detachView() {
this.view = null
}
fun isAttach(): Boolean {
return view != null
}
} 同 package com.taonce.kotlindemo.presenter
import com.taonce.kotlindemo.base.BasePresenter
import com.taonce.kotlindemo.bean.AndroidBean
import com.taonce.kotlindemo.model.MainModel
import com.taonce.kotlindemo.contract.IMainModel
import com.taonce.kotlindemo.contract.IMainView
class MainPresenter(mView: IMainView) : BasePresenter<IMainView>(), IMainModel.OnGetAndroidDataListener {
private var mView: IMainView? = mView
private var mModel: IMainModel? = null
init {
mModel = MainModel()
}
fun getAndroidData(category: String, page: Int) {
this.mView?.showLoading()
this.mModel?.getAndroidData(category, page, this)
}
override fun onGetAndroidDataFinished(bean: AndroidBean?) {
this.mView?.hideLoading()
if (bean != null) {
mView?.showAndroidData(bean)
if (bean.error == "true") {
mView?.showErrorMsg()
}
} else {
mView?.showErrorMsg()
}
}
} BaseActivity在
具体代码如下: package com.taonce.kotlindemo.base
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.taonce.kotlindemo.R
import com.taonce.kotlindemo.ui.inter.IBaseView
abstract class BaseActivity<V, T : BasePresenter<V>> : AppCompatActivity(), IBaseView {
private var baseLoadingView: BaseLoadingView? = null
private var basePresenter: T? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutId())
basePresenter = getPresenter()
basePresenter?.attachView(this as V)
initLoadingView()
initView()
initData()
initEvent()
}
abstract fun getLayoutId(): Int
abstract fun initData()
abstract fun initView()
abstract fun initEvent()
abstract fun getPresenter(): T
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
// 销毁dialog
if (null != baseLoadingView && baseLoadingView!!.isShowing) {
baseLoadingView?.dismiss()
}
baseLoadingView = null
// 在activity销毁时,解绑activity和presenter
if (basePresenter != null) {
basePresenter?.detachView()
basePresenter = null
}
}
override fun onStop() {
super.onStop()
}
override fun onPause() {
super.onPause()
}
private fun initLoadingView() {
baseLoadingView = BaseLoadingView(this, R.style.transparent_dialog)
}
private fun showLoadingView() {
if (null != baseLoadingView) {
baseLoadingView?.show()
} else {
initLoadingView()
baseLoadingView?.show()
}
}
private fun hideLoadingView() {
if (null != baseLoadingView && baseLoadingView!!.isShowing) {
baseLoadingView?.cancel()
}
}
/**
* 将显示dialog和取消dialog放在了基础类中
*/
override fun showLoading() {
showLoadingView()
}
override fun hideLoading() {
hideLoadingView()
}
}
网络网络部分主要采用的是OkHttp3+Retrofit2的方式,通过 整个封装就介绍到这里啦,如果大家觉得有什么不足的地方,欢迎随时交流沟通,期待你们的批评。 使用直接将工程clone到本地,基本的框架已经搭建好,只需根据自己项目的特点添加功能就行 ⊙开源不易,希望给个star或者fork奖励 ⊙长期不定时更新,开源地址:https://github.com/Taonce 写在最后每个人不是天生就强大,你若不努力,如何证明自己,加油! Thank You! --Taonce 如果你觉得这篇文章对你有所帮助,那么就动动小手指,扫描下方的二维码,关注一波吧~~非常期待大家的加入,这是一个专注于Android和Kotlin的公众号 ^.^ |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论