这是一个学习MVP模式的Demo.
一个基于MVP+Retrofit+RxJava+MaterialDesign和gank.io的客户端。
项目截图
pic1
pic2
pic3
pic4
技术点
1. Retrofit 的使用,包括使用 Http 缓存、converter 的使用等;
2. RxJava 的使用,包括配合 Retrofit
3. MVP 架构实践,包括 presenter 的生命周期管理;
4. RecycleView + CardView 的使用;
5. WebView 的使用,包括显示加载进度条、播放视频等;
6. VideoView 的使用,包括自定义按钮;
7. Activity滑动返回的实现
项目结构
api: 网络接口的一些封装,供Presenter调用
base: 基类
bean: 实体类
contract: presenter 和 view 的接口
presenter: presenter 的实现类
view :
widget: 自定义的控件类
总体框架
GankApi:
public interface GankApi {
@GET("api/data/休息视频/10/{page}")
ObservablegetVideoData(@Path("page") int page);
@GET("api/day/{day}")
ObservablegetGankData(@Path("day") String day);
}
{}为占位符 接收传入的参数
ApiManager
public GankApi mGankApi;
public static final String GANK_URL = "http://gank.io/";
public GankApi getGankService(){ if(mGankApi == null){ synchronized (newsClientMonitor){ if(mGankApi ==null){ mGankApi = new Retrofit.Builder() .baseUrl(GANK_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build().create(GankApi.class); } } } return mGankApi; }
根据传入的GankApi得到一个Subscription对象,在Presenter中使用
GankPresenter 需要继承contract的presenter接口
public void getGankData(String day) {
Subscription subscribe = ApiManager.getInstence().getGankService().getGankData(day)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
。。。。。。。。。。。。。。。。。。。。。。
Prensenter中调用getXXData() 方法, 在onNext中得到gson解析完得到的对象,使用传进来的view对象更新数据,这样view层与presenter层就能够很好的被划分。
activity的作用
activity作为全局的控制者,负责创建view以及presenter实例,并将二者联系起来,具体的view交由fragment来实现,两者各司其职。
契约类(contract)
契约类来统一管理view与presenter的所有的接口,这种方式使得view与presenter中有哪些功能,一目了然,维护起来也方便
简单归纳
activity创建fragment及实例化presenter,在实例化的同时,将fragment作为参数传递进去,这样一来在presenter中就可调用view的接口对界面进行更新、展示
presenter实例化时,还调用了view的setPresenter方法,将自身传递进去,这样一来fragment获得了presenter的实例,便可在view中调用presenter进行业务逻辑的操作
view及presenter拥有彼此的实例,实现了在view中调用presenter处理业务,处理完后再presenter中更新view。
总结
至此,一个简单的mvp框架到此结束,对于mvp的使用目前也还在探索中,上例是结合官方发布的demo做的一个简化工程,有不足之处欢迎一起探讨交流!
网友评论