android-architecture之todo-mvp源码分析

博文出处:android-architecture之todo-mvp源码分析,欢迎大家关注我的博客,谢谢!

Android 架构一直都是热门话题,从一开始的 MVC ,到目前火爆的 MVP ,再到方兴未艾的 MVVM 。并不能说哪一种架构最好,因为这些架构都顺应了当时开发的趋势。在这里就不对这三个架构一一解释了,如果想要了解更多的同学可以自行搜索。

自从 2015 下半年来,MVP 渐渐崛起成为了现在普遍流行的架构模式。但是各种不同实现方式的 MVP 架构层出不穷,也让新手不知所措。而 Google 作为“老大哥”,针对此现象为 Android 架构做出了“规范示例”:android-architecture

目前已有的架构示例如下图所示:

stable sample

而今天给大家带来的就是分析 todo-mvp 项目的架构。那就快进入正题吧!

todo-mvp

先来看看项目包的目录结构:

目录结构

基本上目录结构可以分为四种:

  1. addedittask、statistics、taskdetail、tasks :可以看出在 todo-mvp 项目中是按功能来分包的,这些包中的结构都是一致的,待会我们只需要分析其中一个包即可;
  2. data :该分包下主要是数据层的代码,即 MVP 中的 Model 层;
  3. util :工具类包,在这里就不展开细讲了;
  4. BaseView、BasePresenter :MVP 中 View 和 Presenter 的基类。

然后是官方给出的 todo-mvp 架构图:

MVP

BaseView 和 BasePresenter

这里就先看一下 BaseView 的代码:

public interface BaseView<T> {

    void setPresenter(T presenter);

}

BaseView 是一个泛型接口,里面只有一个抽象方法 setPresenter(T presenter) ,用来设置 Presenter 。

然后是 BasePresenter 的代码:

public interface BasePresenter {

    void start();

}

BasePresenter 接口也只有一个抽象方法 start() ,用于在 Activity/Fragment 的 onResume() 方法中调用。

addedittask、statistics、taskdetail、tasks

这四个分包从结构上来讲都是一样的,那么在这里我们就分析 tasks 这个分包吧。下面是该分包下的源码文件:

task分包的结构

我们以 TasksContract 为切入点:

public interface TasksContract {

    interface View extends BaseView<Presenter> {

        void setLoadingIndicator(boolean active);

        void showTasks(List<Task> tasks);

        void showAddTask();

        void showTaskDetailsUi(String taskId);

        ...
    }

    interface Presenter extends BasePresenter {

        void result(int requestCode, int resultCode);

        void loadTasks(boolean forceUpdate);

        void addNewTask();

        ...
    }
}

原来 TasksContract 接口其实就是用来定义 ViewPresenter 的。 ViewPresenter 继承了 BaseViewBasePresenter 。再回头看看上面的 TaskPresenter ,想必大家都猜到了,肯定是继承了 Presenter

public class TasksPresenter implements TasksContract.Presenter {

    private final TasksRepository mTasksRepository;

    private final TasksContract.View mTasksView;

    public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
        mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");

        mTasksView.setPresenter(this);
    }

    @Override
    public void start() {
        loadTasks(false);
    }

    ...
}

TasksPresenter 的构造方法中把 tasksRepositorytasksView 传入,并且把 TasksPresenter 对象设置给了 mTasksView 。这样,Presenter 就实现了 Model 和 View 的解耦。

data

data 代表了 MVP 中的 Model 。我们根据上面出现过的 TasksRepository 来分析。

public class TasksRepository implements TasksDataSource {

    private static TasksRepository INSTANCE = null;

    private final TasksDataSource mTasksRemoteDataSource;

    private final TasksDataSource mTasksLocalDataSource;

    private TasksRepository(@NonNull TasksDataSource tasksRemoteDataSource,
                            @NonNull TasksDataSource tasksLocalDataSource) {
        mTasksRemoteDataSource = checkNotNull(tasksRemoteDataSource);
        mTasksLocalDataSource = checkNotNull(tasksLocalDataSource);
    }

    public static TasksRepository getInstance(TasksDataSource tasksRemoteDataSource,
                                              TasksDataSource tasksLocalDataSource) {
        if (INSTANCE == null) {
            INSTANCE = new TasksRepository(tasksRemoteDataSource, tasksLocalDataSource);
        }
        return INSTANCE;
    }

    ...
}

TasksRepository 实现了 TasksDataSource 接口,TasksDataSource 接口定义了一些对 Task 的增删改查操作。在 TasksRepository 的构造方法中传入两个 TasksDataSource 对象,其实是模拟了本地数据存储和网络数据存储两种方式。至于其他的就不详细展开了,无非就是对数据读写之类的操作。

End

到这里,基本上把 todo-mvp 架构的代码大致地讲了一遍。本篇博客就不对其他的代码展开分析了,因为我们注重的是该项目中的 MVP 架构实现方式。另外,todo 系列还有其他几种 MVP 实现的方式,只能下次有空再讲了。

就到这吧,Goodbye !

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

推荐阅读更多精彩内容

  • 前言 android-architecture是google官方推出的关于Android架构设计的开源项目,相当于...
    管弦_阅读 2,683评论 2 5
  • 人笨学的慢啊。。抓紧学习MVP 网上MVP的学习资料也是多如牛毛,来看看谷歌爸爸是怎么教我们MVP的吧 项目介绍 ...
    hongjay阅读 2,667评论 1 21
  • Google Sample MVP Android架构蓝图 目前Android主流的开发架构:原生开发(MVC),...
    图乐阅读 2,583评论 0 4
  • 作者:李旺成 时间:2016年4月3日 “Android MVP 详解(下)”已经发布,欢迎大家提建议。 MVP ...
    diygreen阅读 128,835评论 86 1,321
  • 给你写这篇文的时候,耳机里放的是毛不易的《消愁》,给你写这句话的时候正好在唱好吧天亮之后总是潇洒离场,清醒的人最荒...
    楠木霂阅读 234评论 0 2