MVP干货Demo

这是一个学习MVP模式的Demo.

一个基于MVP+Retrofit+RxJava+MaterialDesign和gank.io的客户端。

github-app

项目截图

MVP干货Demo_第1张图片
pic1


MVP干货Demo_第2张图片
pic2


MVP干货Demo_第3张图片
pic3


MVP干货Demo_第4张图片
pic4

技术点

1. Retrofit 的使用,包括使用 Http 缓存、converter 的使用等;

2. RxJava 的使用,包括配合 Retrofit

3. MVP 架构实践,包括 presenter 的生命周期管理;

4. RecycleView + CardView 的使用;

5. WebView 的使用,包括显示加载进度条、播放视频等;

6. VideoView 的使用,包括自定义按钮;

7. Activity滑动返回的实现


项目结构


MVP干货Demo_第5张图片

api:   网络接口的一些封装,供Presenter调用

base:   基类

bean:   实体类

contract:   presenter 和  view 的接口

presenter:   presenter 的实现类

view : 

MVP干货Demo_第6张图片

widget:  自定义的控件类

总体框架


MVP干货Demo_第7张图片

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做的一个简化工程,有不足之处欢迎一起探讨交流!

你可能感兴趣的:(MVP干货Demo)