Android架构设计:手把手教你撸一个简洁而强大的MVP框架!

本文详细介绍了MVP架构中的关键组件,如MVPView接口的定义,Presenter的创建与管理,以及如何通过MVPDispatcher实现V层(View)与Presenter的连接。作者还展示了如何在实际项目中应用这些概念,强调了生命周期管理和复用Presenter的重要性,以及资源链接以供进一步学习。
摘要由CSDN通过智能技术生成
  1. 处理完毕后的数据。通过V层提供的协议接口,通知到V层去进行界面更新。

MVP实现


通过上面的实例与讲解。相信可以使大家对MVP模型有一定的了解了,下面我们将一步步的介绍整个MVP模型框架的搭建

1. 基础通信协议接口定义:MVPView

interface MVPView {

fun getHostActivity():Activity

fun showLoadingDialog()

fun hideLoadingDialog()

fun toastMessage(message:String)

fun toastMessage(resId:Int)

}

MVPView中定义了一些基础的协议方法。这些方法是所有V层都需要的功能。比如Toast展示、进行异步任务时的加载中Dialog展示等。

2. 基础Presenter创建

open class MVPPresenter<T:MVPView>(private var view:T?){

fun attach(t:T) {

this.view = t

}

fun detach() {

this.view = null

}

fun isViewAttached() = view != null

fun getActivity() = view?.getHostActivity()?:throw RuntimeException(“Could not call getActivity if the View is not attached”)

// Lifecycle delegate

open fun onCreate(bundle: Bundle?) {}

open fun onDestroy(){}

}

我们来一条条的捋一下:

首先。我们在上面的MVP说明中说过,MVPView为协议接口,提供出来用于进行P-V绑定,所以相应的就会有P-V的绑定与解绑功能(为了方便使用,这里也让默认构造器自动进行了P-V绑定)

fun attach(t:T) { this.view = t }

fun detach() { this.view = null }

然后,我们会经常需要在P层中使用绑定的Activity去进行各种操作。而p层是不建议去持有Context实例的,所以在此提供一个getActivity方法,从绑定的view中去获取正确的Activity实例提供使用:

fun getActivity() = view?.getActivity()?:throw RuntimeException(“Could not call getActivity if the View is not attached”)

isViewAttached方法,则是专门为异步回调任务所设计的api。因为如果是使用异步回调的方式去从model层获取的数据。那么很可能,接收到回调消息的之前,这个时候view已被解绑置空。导致通知失败

所以。一般来说。对于任务中有异步回调操作的,应该在回调处。先行判断是否已解绑。若已解绑则跳过当前操作:

if (!isViewAttached()) return

view?.hideLoadingDialog()

最后,则是提供的一堆onXXX生命周期方法了。用于与activity/fragment 中的生命周期进行绑定。

3. V-P连接器

其他的MVP相比不同,这里提供MVPDispatcher作为V-P连接器

class MVPDispatcher{

private val presenters:MutableList<MVPPresenter<*>> = mutableListOf()

// ==== 添加与移除Presenter ========

fun <V:MVPView> addPresenter(presenter:MVPPresenter) {…}

internal fun <V:MVPView> removePresenter(presenter:MVPPresenter) {…}

// ==== 绑定生命周期 ==========

fun dispatchOnCreate(bundle:Bundle?) {…}

fun dispatchOnRestoreInstanceState(savedInstanceState: Bundle?) {…}

}

可以看到此连接器干了以下几件事:

  1. addPresenterremovePresenter:向容器presenters中添加或移除presenter实例 。 做到对单页面绑定多个presenter的效果。

  2. dispatchOnXXX:通过已添加的presenter进行生命周期通知做到V-P生命周期绑定的效果

  3. 在接收到V层destroy销毁通知时,自动移除解绑所有的presenter实例

fun dispatchOnDestroy() {

presenters.forEach {

if (it.isViewAttached()) { it.onDestroy() }

// 生命方法派发完毕后。自动解绑

removePresenter(it)

}

}

4. BaseMVPActivity的创建

最后就是真正的V层的创建了:Activity/Fragment的MVP基类搭建!

这里使用BaseMVPActivity作为举例说明。fragment的基类搭建与此大同小异。

首先,我们需要确定BaseMVPActivity所需要尽到的职责:

1. 一个具体的V层,需要持有一个唯一的MVPDispatcher进行操作

abstract class BaseMVPActivity:Activity() {

val mvpDispatcher = MVPDispatcher()

}

2. 统一实现默认协议方法:MVPView

abstract class BaseMVPActivity:Activity(), MVPView {

override fun getHostActivity():Activity {…}

override fun showLoadingDialog() {…}

override fun hideLoadingDialog() {…}

override fun toastMessage(message:String) {…}

override fun toastMessage(resId:Int) {…}

}

3. 借助MVPDispatcher实现V-P,一对多的绑定

abstract class BaseMVPActivity:Activity(), MVPView {

// 由子类提供当前页面所有需要绑定的Presenter。

open fun createPresenters():Array<out MVPPresenter<*>>? = null

override fun onCreate(savedInstanceState: Bundle?) {

// 创建所有的presenter实例,并通过mvpDispatcher进行绑定

createPresenters()?.forEach { mvpDispatcher.addPresenter(it) }

}

}

比如在最上面我们所举例的LoginActivity。假设现在我们需要对登录页再添加一个验证码校验逻辑. 此逻辑被放在了CaptchaPresenter中:

class LoginActivity:BaseMVPActivity(),LoginView, CaptchaView {

// 登录的Presenter实现

val loginPresenter = LoginPresenter(this)

// 验证码的Presenter实现

val captchaPresenter = CaptchaPresenter(this)

// 绑定多个Presenter

override fun createPresenters() = arrayOf(loginPresenter, captchaPresenter)

}

这就做到了Presenter的复用。在需要共用一些基础业务逻辑的时候。此一对多的绑定是个很好的特性!

4. 借助MVPDispatcher实现V-P生命周期关联管理

abstract class BaseMVPActivity:Activity(), MVPView {

…// other codes

override fun onCreate(savedInstanceState: Bundle?) {

mvpDispatcher.dispatchOnCreate(intent?.extras)

}

override fun onDestroy() {

// 销毁时mvpDispatcher会自动进行所有的Presenter的解绑。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。详情可以点击我的【Github】
如果你熟练掌握【Github】中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

【Github】中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-sf3HK2DM-1710824659931)]

[外链图片转存中…(img-WabU0Brm-1710824659931)]

[外链图片转存中…(img-ZQxMuu93-1710824659931)]

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值