带看android-architectrue

本文将解读有名的android-architecture中的mvp相关分支
mvp是一种设计方式 ,设计方式首先要适应需求。因此, 其app建议大家先试用一下。非常简单,总共四个模块 。 但是已经基本具备了实用app的功能,其核心数据是Task, 页面主要有列表展示、详情、增加、统计。

以下会简单带大家捋一捋其思路

1.mvp (最基础的部分)

基本架构,后面的几个分支都是依托在此分支上略加修改的。
结构并不复杂,是按照模块划分的,我们主要探讨的是其中的设计模式,因此现在只保留其中的一小部分:

├── BasePresenter.java
├── BaseView.java
├── data
│   ├── Task.java
│   └── source
│       ├── TasksDataSource.java
│       ├── TasksRepository.java
├── tasks
│   ├── TasksActivity.java
│   ├── TasksContract.java
│   ├── TasksFilterType.java
│   ├── TasksFragment.java
│   └── TasksPresenter.java

其主要对应关系是:

diagram_mvp.png

(TaskRepository 扮演的是Model的角色)

熟悉mvp的同学也可以顺便参考一下其实现细节。
[1]. Activity负责Presenter和View(Fragment)的创建,也保有Presenter的实例。
[2]. 分层清晰,三个模块中只有Presenter持有Model。TasksPresenter和TaskFragment互相持有,但是只依赖了其接口(依赖倒置原则:只依赖其抽象)。
[3]. model层也负责了网络请求等。

View 层的实现非常简单,View层的实现者是Fragment来做
用例1:

#TaskPresenter.java
 @Override
    public void loadTasks(boolean forceUpdate) {
        // Simplification for sample: a network reload will be forced on first load.
        loadTasks(forceUpdate || mFirstLoad, true);
        mFirstLoad = false;
    }

    /**
     * @param forceUpdate   Pass in true to refresh the data in the {@link TasksDataSource}
     * @param showLoadingUI Pass in true to display a loading icon in the UI
     */
    private void loadTasks(boolean forceUpdate, final boolean showLoadingUI) {
        if (showLoadingUI) {
            mTasksView.setLoadingIndicator(true);
        }
        if (forceUpdate) {
            mTasksRepository.refreshTasks();
        }

        // The network request might be handled in a different thread so make sure Espresso knows
        // that the app is busy until the response is handled.
        EspressoIdlingResource.increment(); // App is busy until further notice

        mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {
            @Override
            public void onTasksLoaded(List<Task> tasks) {
               ...
                // The view may not be able to handle UI updates anymore
                if (!mTasksView.isActive()) {
                    return;
                }
                if (showLoadingUI) {
                    mTasksView.setLoadingIndicator(false);
                }

                processTasks(tasks);
            }

            @Override
            public void onDataNotAvailable() {
                // The view may not be able to handle UI updates anymore
                if (!mTasksView.isActive()) {
                    return;
                }
                mTasksView.showLoadingTasksError();
            }
        });
    }

用例2:

#TasksPresenter.java
@Override
    public void completeTask(@NonNull Task completedTask) {
        checkNotNull(completedTask, "completedTask cannot be null!");
        mTasksRepository.completeTask(completedTask);
        mTasksView.showTaskMarkedComplete();
        //在之后需要重新载入一次数据
        loadTasks(false, false);
    }

2.mvp-clean

我们发现,在实际的操作过程中,Presenter作为主要的逻辑处理者,到最后可能会变得非常臃肿。

而mvp-clean中就采用细化拆分的方式为Presenter瘦身。
几个用例被拆分成不同的类,分担了之前的业务逻辑代码。

image.png

UserCase的使用是比较典型的命令模式。多数同学可能对这个不太熟悉。
关于命令模式跳转
重点关注一下UserCase这个类:

public abstract class UseCase<Q extends UseCase.RequestValues, P extends UseCase.ResponseValue> {
    //请求参数被抽象
    private Q mRequestValues;
 
    // 返回结果也被抽象
    private UseCaseCallback<P> mUseCaseCallback;

    ...

    void run() {
       executeUseCase(mRequestValues);
    }

    //excute方法是命令方式一个比较明显的特征
    protected abstract void executeUseCase(Q requestValues);

    /**
     * Data passed to a request.
     */
    public interface RequestValues {
    }

    /**
     * Data received from a request.
     */
    public interface ResponseValue {
    }

    public interface UseCaseCallback<R> {
        void onSuccess(R response);
        void onError();
    }
}

这里比较新奇的是有两个空接口,RequestValue以及ResponseValue。
空接口在这里其实是语义上的声明。

另外有一点需要特别注意的是:
UseCase可能已经是业务上的最小划分了。在实际工程中遇到了两个页面需要不同的Presenter,而两个Presenter可能需要使用同一个用例。这个时候可以根据需要拼装已经写好的UseCase。
层级的划分,必然会减少重复代码。

(泡泡中遇到这种场景使用的是Helper,如对feed的点赞等。其实是一样的拆分原理。)

关于mvp-clean,其实最重要的是

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,237评论 25 707
  • 转载至:http://www.jianshu.com/p/9a6845b26856 “Android MVP 详解...
    SnowDragonYY阅读 10,315评论 5 241
  • 作者:李旺成 时间:2016年4月3日 “Android MVP 详解(下)”已经发布,欢迎大家提建议。 MVP ...
    diygreen阅读 128,795评论 86 1,321
  • [宋]陆游 红酥手,黄藤酒。满城春色宫墙柳; 东风恶,欢情薄, 一怀愁绪,几年离索, 错,错,错! 春如旧,人空瘦...
    啰唝曲阅读 462评论 0 0
  • 云遮皎月秋已晚,孤星夜,暖玉欠,小楼南窗寒风剪,池间蛙声一片,遥寄今宵,铭心诗卷,千年经犹转。 流芳已逝梦难断,暮...
    可有可无9527阅读 262评论 0 2