Andorid 泛型深度解藕下的MVP大瘦身

uwoxtfnx 8年前
   <h2>导语</h2>    <p>删繁就简三秋树,领异标新二月花</p>    <blockquote>     <p>传统MVP给人的第一感觉通常是接口和类的暴涨,将Activity中除V之外的繁杂操作搬到P之后依然臃肿不堪。MVP从来都不是救命稻草,只能锦上添花,不能雪中送炭。也许在权衡利弊之后,很多人会对MVP望而却步。 现在 我们换一个思路,取其精华,去其糟粕,完成T-MVP大变身。</p>    </blockquote>    <h2>一、T-MVP简介</h2>    <p>话不多说,先上图:</p>    <p><img src="https://simg.open-open.com/show/5b48db848291050c26223cf6a214ab50.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="1220" height="1242"></p>    <p style="text-align: center;">T-MVP架构图</p>    <p>下面,看看如何利用泛型把我们从繁杂重复的劳动中解救出来。</p>    <blockquote>     <p>后台接口用的是LeanCloud的REST API,数据通过Node爬虫从网页上获取,先爬出十个页面的列表,然后每一个列表爬进去获取文章详情。爬虫代码见app.js。(建议替换成自己申请的appId和appKey)。</p>    </blockquote>    <h2>1、页面分层结构</h2>    <p>宗旨:纯粹界面操作交互,不需要MP参与的行为,尽量V自己做,保证MVP职责清晰,P只有干净简洁的协助VM的业务逻辑操作,M只处理数据操作。</p>    <p><img src="https://simg.open-open.com/show/95eeb5c4e5f849c2282124221960c314.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="924" height="448"></p>    <p>登录契约类</p>    <p>相比谷歌官方Contract类,多了一个Model,用于将P中繁杂的数据操作分离解耦,让P层变得简洁明了,只处理M和V相关操作即可,登录Present的全部代码:</p>    <p><img src="https://simg.open-open.com/show/7d74dfda43a3ace692c18021ba768264.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="958" height="556"></p>    <p>登录Present的全部代码</p>    <p>RxManage用于管理订阅者、观察者、以及事件。(详见代码)<br> 例如:<br> 发送事件: <code>mRxManage.post(C.EVENT_LOGIN, user);</code><br> 接收事件:</p>    <p><code>mRxManage.on(C.EVENT_LOGIN, arg ->mView.initUserInfo((_User) arg));</code></p>    <p>LoginModel的全部代码:</p>    <p><img src="https://simg.open-open.com/show/f41976aed27e2154c85e6e833ed779e2.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="984" height="476"></p>    <p>LoginModel的全部代码</p>    <p>抽离出Model不仅各层更加分工明确便于Model的复用,而且大大简化了Presenter的代码量,让P层更简洁更专注。职能清爽,一目了然。</p>    <h2>2、列表页</h2>    <p>例如一个列表页,用户关心的,只有列表的Item展示:</p>    <p><code>mTRecyclerView.setItemView(ItemView.class);</code></p>    <p>不需要在当前页面写网络请求,不需要写下拉刷新和分页加载更多的回调,不需要写任何Adapter,只需要这一句即可。因为用泛型在TRecyclerView里面写过抽象层的操作,将监听和数据的获取封装成通用模板,从此可以一劳永逸了。</p>    <p>比如,分页加载的封装操作:</p>    <p><img src="https://simg.open-open.com/show/778a495f80fcc0f8d5905a12ad78a9f4.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="1010" height="478"></p>    <p>TRecyclerView部分代码</p>    <p>对于有HeaderView的List也一样:</p>    <p> </p>    <p><code>mTRecyclerView.setHeaderView(HeaderView.class).setItemView(ItemView.class);</code></p>    <p>ViewHolder也是相当简洁的写法:</p>    <p><img src="https://simg.open-open.com/show/889ef8098f79ec1c50b966e3a17431f1.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="1298" height="314"></p>    <p>ViewHolder</p>    <p>至此,项目可以永远告别OnRefresh ,onLoadMore ,Adapter。</p>    <h2>3、项目结构</h2>    <p>利用泛型封装的一些Base类,总代码不超过1000行,也是T-MVP的核心:</p>    <p><img src="https://simg.open-open.com/show/10a61125c27dfa6a1ea64f30c27863fa.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="546" height="1052"></p>    <p>T-MVP项目结构])X{FRT]K9SMSZ}CY.jpg</p>    <p>T-MVP利用泛型解藕和高度抽象封装之后,相较于传统MVC和MVP代码量大大精简,架构的代码量也是精简至极:</p>    <p>例如BasePresenter的全部代码:</p>    <p><img src="https://simg.open-open.com/show/d15d50ba374e15d4e87014ed3d0a888f.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="704" height="478"></p>    <p>BasePresenter的全部代码</p>    <p>二、T-MVP的目标</p>    <pre>  <code>//TODO</code></pre>    <ul>     <li>1 整理Base类,吸纳意见之后,继续优化封装,将简洁进行到底。让MVP不再背负繁杂的名声。</li>     <li>2 发布到github</li>     <li>3 争取发布到jcenter</li>    </ul>    <p>三、进度</p>    <ul>     <li>1登录、注册</li>     <li>2列表分类</li>     <li>3文章详情 文章评论列表</li>     <li>4用户中心 用户评论列表</li>     <li>5更换头像</li>     <li>6用户列表</li>    </ul>    <p>项目截图:</p>    <p><img src="https://simg.open-open.com/show/27f89c91eda2e3e58e6122fccf41eedb.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="690" height="1227"></p>    <p>7247fc46jw1f3p5r5tsynj20u01hcwl0.jpg</p>    <p><img src="https://simg.open-open.com/show/e0779b874dfb6fc1e74adc9e677e1d17.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="690" height="1227"></p>    <p>7247fc46jw1f3p5r8cjjhj20u01hc47t.jpg</p>    <p><img src="https://simg.open-open.com/show/0c9f908f931900179a41ddc00fbecbf0.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="690" height="1227"></p>    <p>7247fc46jw1f3p5r35jqnj20u01hcdt4.jpg</p>    <p><img src="https://simg.open-open.com/show/48ea277bc8320bbd6df4c0f2dc6085a2.jpg" alt="Andorid 泛型深度解藕下的MVP大瘦身" width="690" height="1227"></p>    <p> </p>