MVP本身只是种编程分层架构思想,所以MVP并没有严格意义上的标准实现方式。
因为每个app所使用的基础Actvitiy/Fragment都是不统一的。所以在MVP层的封装中, 并没有将BaseMVPActivity的具体实现放入集成库中,而是在sample代码中提供了一份推荐的实现示例:
需要使用MVP模式的。请记得仿照上方的示例代码。或者copy进入项目并修改成自身所需要的BaseActivity/BaseFragment等进行使用。
- 创建页面通信协议接口:
interface CustomView:MVPView {
// 定义通信协议方法:P层将使用此方法驱动V层进行界面更新
fun updateUI()
}
- 创建Presenter。并与对应的通信协议相绑定:
class CustomPresenter(view:CustomView):MVPPresenter(view) {
// 直接创建对应的启动方法,供V层进行启动调用
fun requestData() {
// TODO 进行数据业务处理。并在处理完成后
// 通过绑定的V层协议接口。通知到V层去进行界面更新
view?.updateUI()
// 或者如果执行的是异步任务:比如进行api访问。
// 需要在回调后进行绑定逻辑判断:是否已经与V层解绑.
// 避免造成由于已解绑后继续执行造成crash
if (!isViewAttached()) return
}
}
- 创建具体的V层(Activity or Fragment),并绑定Presenter进行使用:
class CustomActivity:BaseMVPActivity<CustomPresenter>, CustomView {
override fun updateUI() {// TODO 进行界面更新}
fun initPage() {
// 通过绑定的Presenter发起任务
presenter?.requestData()
}
}
abstract class BaseMVPActivity<out P:MVPPresenter<*>>:Activity(), MVPView{
// 一个Activity持有一个唯一的Dispatcher派发器。
val mvpDispatcher by lazy { MVPDispatcher.create() }
// 一般来说。一个Activity只需要绑定一个Presenter即可。
// 所以此处绑定一个默认的Presenter。方便进行使用
val presenter:P? by lazy { return@lazy createPresenter()}
// 然后再对应生命周期进行派发
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 将默认presenter进行绑定。
if (presenter != null) {
mvpDispatcher.addPresenter(presenter!!)
}
mvpDispatcher.dispatchOnCreate(intent?.extras)
}
override fun onStart() {
super.onStart()
mvpDispatcher.dispatchOnStart()
}
override fun onResume() {
super.onResume()
mvpDispatcher.dispatchOnResume()
}
override fun onPause() {
super.onPause()
mvpDispatcher.dispatchOnPause()
}
override fun onStop() {
super.onStop()
mvpDispatcher.dispatchOnStop()
}
override fun onRestart() {
super.onRestart()
mvpDispatcher.dispatchOnRestart()
}
override fun onDestroy() {
super.onDestroy()
mvpDispatcher.dispatchOnDestroy()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
mvpDispatcher.dispatchOnActivityResult(requestCode, resultCode, data)
}
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
mvpDispatcher.dispatchOnSaveInstanceState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
mvpDispatcher.dispatchOnRestoreInstanceState(savedInstanceState)
}
// MVPView中本身也已定制了部分通用协议方法。在此进行默认实现
final override fun getActivity(): Activity {
return this
}
override fun showLoadingDialog() {
progressDialog.safeShow()
}
override fun hideLoadingDialog() {
progressDialog.safeDismiss()
}
override fun toastMessage(message: String) {
EasyToast.DEFAULT.show(message)
}
override fun toastMessage(resId: Int) {
EasyToast.DEFAULT.show(resId)
}
// 创建默认的Presenter实例。如果你需要。
// 也可以考虑直接读取泛型指定的类型。直接通过反射进行创建
abstract fun createPresenter():P
}