Kotlin+Mvp+RxJava+Post Android开发经验

首次访问项目Github地址:Judy KotlinMvp
首先声明:
本项目基于git-xuhao/KotlinMv项目。 Mvp核心代码和Adapter代码是我按照自己的想法重构的。布局(xml)文件(除外)、设备类和自定义视图都直接从原始项目文件中使用。这个项目的主要目的是学习 Kotlin 并传授我使用 Kotlin 的 Mvp Understanding Java 版本的知识。
解释
我希望用尽可能少的文字和代码来理解Mvp。
Mvp
Mvp的主要目的就是将其分离出来,让各个模块各司其职。
M(模型)
负责构建业务模型。简单理解就是P需要的数据结构在这一层进行处理和封装(包括network、Sqlite、sp等)。
可参考MainModel。您可以根据当前情况控制模型的细节。
P(presenter)
负责处理业务逻辑,可以简单理解为判断等时的UI操作。
UI操作不仅仅是调用UI的数据更新操作,还包括何时显示进度字段、隐藏进度字段、绑定UI生命周期等。
(keyWords!!)
.compose(NetTransformer())//异步调度(异步发起请求 --> 主线程回调)
.compose(ProgressTransformer(view))//进度框的显示与隐藏
.compose(bindUntilOnDestroyEvent())//绑定UI生命周期 (PS: 生命周期时机可控)
.subscribe(object : RxSubscribe() {
……
})
上面的代码使用了三行代码来执行异步调度、显示和隐藏进度窗口以及捆绑UI生命周期(以防止内存泄漏)。这就是RxJava的魔力。
参见:VideoDetailPresenter
V(视图)
负责提供用户界面的交互能力。可以简单理解为V监听用户点击事件-->P处理业务逻辑-->V更新UI。
Activity和fragment V,其中Adapter、View(xml、自定义视图)、Dialog等V 的部分。所有交互事件都放在Activity和Fragment中,方便以后定位。
项目中的Mvp实现
//依赖关系
View < —— > Presenter —— > Model
在本项目中,我们使用泛型来指定依赖,直接依赖的具体实现不依赖于抽象,这样可以有效提高开发效率,但违反了设计原则。我个人认为它们太重要了。一个不值得降低开发效率的基本原则。
//基类 V (MvpFragment 同理)
abstract class MvpActivity<P> : MvcActivity() {
val presenter: P by lazy {
getP()
}
/**
* 获取逻辑处理实例,子类实现
*/
abstract fun getP(): P
……
}
//具体实现
class SearchActivity : MvpActivity() {//泛型指定 P 的依赖关系
// 这里实例化 P 并且 注入 V
override fun getP() = SearchPresenter().apply { view = this@SearchActivity }
}
//基类 P
open class BasePresenter<V : Any, out M> : ViewLifecycle() {
/**
* UI视图,即Activity或Fragment
*/
var view: V by ()
/**
* 业务模型,即XXXModel,这里使用java反射(kotlin反射太慢,暂时不建议使用)创建示例,省去在每个Presenter中创建实例
*/
val model: M by lazy {
//这里使用 Java 反射实例化 M,
(this, 1)
}
……
}
//具体实现
class SearchPresenter : BasePresenter<SearchActivity, MainModel>() {//泛型指定 V 和 M 的具体实现
……
}
Mvp之间的联系是通过上面的代码建立的。注意M是通过Java反射实例化的(不需要在P的实现类中实例化,直接使用即可),具体使用即可。查看代码。
MvpActivity
BasePresenter
解决痛点
抽象(创建了太多无用的接口)
以前使用过这一点的人应该对Mvp有深入的了解。直接依赖具体的实现可能会很好。为了解决这个问题,还可以将泛型指定为需要重用的接口,以实现可重用性。实际项目中,没有必要这样的复用。
异步导致内存泄漏
异步时间过长,界面退出,Activity实例仍然隐式在回调中。这个问题在开发中很常见,所以我们在项目中使用了 RxJava(异步工具),由于它可以灵活处理异步问题,通过添加另一个很棒的开源库,RxLifecycle 可以轻松处理这个问题,而且代码也非常漂亮(可以创建一行代码),最重要的是,可以控制处理时间(例如在 onStop 或 onDestory 中)。
//为了控制篇幅,偷懒了,参照前面贴的代码
compose(bindUntilOnDestroyEvent())//绑定UI生命周期 (PS: 生命周期时机可控)
进度控制UI
对于弹出进度、下拉刷新、上拉加载、布局不规则等控制问题,RxJava可以完美解决。一行代码解放了开发者的大脑,不用考虑什么时候显示。 ,什么时候隐藏。
//为了控制篇幅,偷懒了,参照前面贴的代码
compose(ProgressTransformer(view))//进度框的显示与隐藏
ProgressTransformer
交互由Activity或Fragment处理
你遇到过因为修改而留下错误的同学吗?搜索click事件的时候,跳转到N个类,最后发现事件监听事件中发送了一个事件,那么我们需要查找谁消费了这个事件,发现居然有N个类消费了这个事件(我是很困惑,我的真实经历...),这个项目的做法是把最后的监听放在V里。在addListener方法中,我们在搜索时可以快速找到交互事件。
RxJava
RxJava 使您的代码更加连贯,逻辑上易于理解(尤其是在查看原始代码时),并且更加简洁。项目中可以使用RxJava来优雅的解决异步调度、进程框的显示和隐藏、用户界面的声明等。循环绑定问题简单灵活。
RxJava 对于初学者来说是一个相对困难的库。网上有很多文章,但读完之后,不知道什么好用,什么简洁。在这里分享一下我初步的学习方法:
- 首先,效仿南瓜,硬着头皮用起来,对RxJava有一个初步的概念。
- 有了初步的概念,再回去看文章会有不一样的体验。您将理解作者在说什么并学习一些常用的运算符。
- 根据自己的理解,最好找生活中的例子进行比较和理解。
- 了解更多运算符和运算符图。
- 操源码,分享写文章。
以上方法并不适合所有人。如果将来有机会,我也会写一些我使用 RxJava 的经历。
Postbuild
Postbuild是一个遵循RESTful设计标准的网络请求嵌入库。
Retrofitting使用了大量的设计模式,其中动态代理+注解的思想来声明后端非常优雅。另外,它还提供了网络请求适配器和数据转换器插件,基本满足了大部分业务需求。 。 改造简单流程图.jpg
上图是我整理的简单改造流程图。我们建议阅读 Retrofit 源代码。这并不难,并且包含很多技术知识。你可以在网上找一篇有源码的文章,一起阅读。
总结
- 分享你对Mvp的理解。
- 分享了如何优雅地解决异步调度、进度框显示隐藏控制、UI生命周期绑定等相关问题。
- 讲解项目Mvp连接的实现逻辑!
- 描述该项目将解决的痛点。
- 分享如何学习 RxJava。
- 改造简单流程图。
如果有不同意见,可以留言或issue。本项目转换部分的代码注释比较完整,方便大家使用。谢谢!
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。