最近写了一个 Android 小 Demo,使用基于Nucleus库的MVP框架进行代码分割,并Retrofit和RxJava进行数据请求和处理,下面通过Demo代码分享下这几种技术的使用方法。
需求
从网络Api获取Json格式的笑话数据,通过列表方式显示,列表分页显示,当上拉到最后一个数据是,自动从网络加载数据并显示,在顶端进行下拉式刷新数据。
最终效果图:
App下载地址: http://a.app.qq.com/o/simple.jsp?pkgname=chenyu.jokes
微信扫描下载APP:
源码地址: https://github.com/zhongchenyu/jokes
由于后续代码可能会做重构,本文介绍的代码保存在 demo1 分支,请 checkout。
MVP简介
项目采用的是MVP框架,MVP分别代表
- Model:数据接入层,例如数据库API或者远程服务器API。
- View:显示数据并响应用户操作。在Android系统上可以是Activity、Fragment、android.view.View或者对话框等。
- Presenter:负责从Model提供数据给View的层,同时处理后台任务。
传统View-Model框架示意图:
MVP框架示意图:
简单对比传统View-Model和MVP,可以发现MVP框架各个模块直接的耦合度更低,Presenter承接了Data(Model)和View直接的协调工作,Data和View是完全解耦的。
MVP带来很多好处,例如:
- 使项目代码的层次划分更加清晰,对测试和后期维护带来便利
- 减小Activity的复杂度
- 更方便进行后台服务生命周期控制,减少内存溢出的可能
了解更多,参考MVP介绍文章: Introduction to Model View Presenter on Android
MVP实践
定义Model
我们的数据来自于网络API,返回的Json数据格式如下:
{
"error_code": 0,
"reason": "Success",
"result": {
"data": [
{
"content": "同事来我家打麻将,我特意炖了牛肉,心想着打完麻将,肉也炖好了,有吃有玩,其乐融融。但现实是,他们不但吃光了我的牛肉还赢光了我的钱。。。",
"hashId": "323dea183f2baba507983829b55aeda1",
"unixtime": 1490873030,
"updatetime": "2017-03-30 19:23:50"
},
{
"content": "花卷妹妹被包子给欺负了,花卷妹妹生气的说道:“你等着我找我男朋友,他可是一个壮汉,打不死你。” 包子嘲笑道:“你去吧,我等着你!” 不一会儿,花卷妹妹带了馒头哥来到了包子面前,馒头又大又壮。 可是包子上去三拳两脚就把馒头哥打败了。 花卷妹妹哭道:“你这么壮怎么连他都打不过啊?” 馒头哥委屈道:“你有所不知啊,我是酵母发酵的,我这不是壮,这是虚胖啊!”",
"hashId": "9862276b1b74b4b7df8865e36eaa0349",
"unixtime": 1490867030,
"updatetime": "2017-03-30 17:43:50"
}
]
}
}
依据返回数据格式的嵌套层次,定义了Response、Result、Data 3个Model,用于解析和存储数据。
这里用到了Jackson库做Json数据处理,Parceler库做Parcelable处理。使用方法都很简单,用注解就可以。
package chenyu.jokes.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.parceler.Parcel;
/**
* Created by chenyu on 2017/3/3.
*/
@Parcel @JsonIgnoreProperties(ignoreUnknown = true)