MVP干货Demo

作者: QieZi | 来源:发表于2016-09-09 23:13 被阅读229次

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

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

    github-app

    项目截图

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

    相关文章

      网友评论

        本文标题:MVP干货Demo

        本文链接:https://www.haomeiwen.com/subject/wgzeettx.html