安卓日记——MVP重构知乎日报

在之前安卓日记——手把手教你做知乎日报已经教大家分析和利用API做出一个简单的知乎日报,源码在github上也收到了5个star
最近我一直很想用一下一直很玄乎的MVP,主要参照谷歌的todo-mvp-rxjava
然后我就想不如就把知乎日报用MVP重构一下吧

我理解中的MVP,以数据库或者网络请求作为M(通常多个共用,所以不单独写)一个Fragment或者Activity作为V,然后把之前的业务逻辑都写在P里。
有人把P当作老板,去指使M和V
而我认为V才是大BOSS,V中创建P,然后把些粗活累活都交给P,P把数据获取外包给M,然后V说我只要看到结果,接收到P传来的结果,就心满意足了

项目可以按照模块分包(登录功能,注册功能……),也可以按照组件分包(P分一类,V分一类……)
我模仿谷歌的todo-mvp-rxjava采用模块分包

这里写图片描述

我看过很多mvp的项目,他们很多是按组件分包的,而且他们都没有一个Contract
在我看来Contract是很有必要的,有了它把职责的分明了,互相调用的方法暴露出来,这样开发的目的会更加明确,分工也更加简单

事不宜迟,现在开始讲如何进行重构
我假设你们都已经懂得如何用我之前的方法做一个知乎日报

1.分析功能模块

这里主要有首页和详情页两个模块

2.写基类

基类不仅节省代码,提高效率,这个不用说了吧

public interface BasePrecenter {
    void subscribe();
    void unsubscribe();
}
public interface BaseView<T extends BasePrecenter> {
    void setPrecenter(T precenter);
}

3.写Contract

Contract中可以不包含M,因为M通常都是公用的,所以单独放,我这Service就是M,主要是网络请求数据

public interface ArticleContract {
    interface View extends BaseView<Precenter>{
        void showAtrticleDetail(String content);
    }
    interface Precenter extends BasePrecenter{
        void loadArticleDetail(int id);
    }
}

4.写Bean和Model

确定好数据的格式和获取的方式
我这里采用的是用retrofit获取数据

public interface ActionService {
    public static String baseUrl="http://news-at.zhihu.com";
    //今日头条
    @GET("/api/4/news/latest")
    Observable<RootBean> getLatestNews();
    //互联网安全
    @GET("/api/4/theme/10")
    Observable<RootBean> getSafety();
    //不准无聊
    @GET("/api/4/theme/11")
    Observable<RootBean> getInterest();
    //体育日报
    @GET("/api/4/theme/8")
    Observable<RootBean> getSport();
    //传入id查看详细信息
    @GET("/api/4/news/{id}")
    Observable<ArticleDetailBean> getNewsDetails(@Path("id") int id);

}

5.然后再写P和V

V中创建P,创建P需要传入V

        //创建P传入V
        precenter=new HomePrecenter(this);
        setPrecenter(precenter);

P中绑定V,并且创建M

 public HomePrecenter(HomeContract.View view){
        //绑定V
        this.view=view;
        //创建M
        service= ServiceFactory.createRetrofitService(ActionService.class,ActionService.baseUrl);
    }

之后主要是一些互相调用Contract中约定好的方法

补充:

P中有subscribe和unsubscribe方法可以与V中的onResume和onPause方法绑定
这样V开始时继续P的业务,暂停时停止P的逻辑

    @Override
    public void onResume() {
        super.onResume();
        precenter.subscribe();
    }

    @Override
    public void onPause() {
        super.onPause();
        precenter.unsubscribe();
    }
}

P中将要执行的业务都添加进CompositeSubscription中,unsubscribe时把CompositeSubscription清空掉

                subscription.add(rootBean
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<RootBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(RootBean rootBean) {
                        view.showArticle(rootBean.getStories());
                    }
                }));
 @Override
    public void unsubscribe() {
        subscription.clear();
    }

重构后竟然一次通过了,太兴奋了

效果图

这里写图片描述

源码下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • 前言 看了下上篇博客的发表时间到这篇博客,竟然过了11个月,罪过,罪过。这一年时间也是够折腾的,年初离职跳槽到鹅厂...
    西木柚子阅读 21,235评论 12 184
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 外联一家人阅读 147评论 0 0
  • 见 惊艳 目流连 再难思迁 踌躇欲向前 只恐天上人间 悲欢喜怒一线牵 循环往复恨此心坚 花开花落转眼已三年 天人合...
    小随笔阅读 1,067评论 0 2