项目地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

项目结构

本项目的理念基于Clean Architecture.
项目架构基于基本的MVP示例。添加了domain 层,在 presentation层和 repositories层之间。总体就将App分成了三层:
Android 官方示例:android-architecture 学习笔记(五)之todo-mvp-clean_第1张图片

层次说明

MVP

从MVP示例而来的Model View Presenter 架构

Domain

拥有所有的业务逻辑。domain层中的类命名,都以use cases或interactors开始,它们被使用在App中的presenters中。(本项目,实际是在每个功能模块下定义了一个package : domain/usecase)

Repository

与MVP示例中的Repository一样。

模块分析

基础类

主包下多了四个类:
UseCase —— 用例类,是一个抽象类。内部还定义了两个接口RequestValues、ResponseValue,这是两个空接口,用于请求和响应时的回调处理。一个抽象方法executeUseCase(),用于执行用例
UseCaseHandler —— 用例处理类,单例。组合了UseCaseScheduler
UseCaseScheduler :

public interface UseCaseScheduler {    //执行用例    void execute(Runnable runnable);    //响应通知给callback    extends UseCase.ResponseValue> void notifyResponse(final V response,            final UseCase.UseCaseCallback useCaseCallback);    //错误通知给callback    extends UseCase.ResponseValue> void onError(            final UseCase.UseCaseCallback useCaseCallback);}

UseCaseThreadPoolScheduler —— UseCaseScheduler的实现类
还有一个prod或mock源目录(取决于build variant)下的 Injection类。使用依赖注入的方式,提供获取各种use case类型的访问方法。

statistics模块

包结构:
Android 官方示例:android-architecture 学习笔记(五)之todo-mvp-clean_第2张图片
先来看下usecase/GetStatistics类:

public class GetStatistics extends UseCase<GetStatistics.RequestValues, GetStatistics.ResponseValue> {    private final TasksRepository mTasksRepository;    public GetStatistics(@NonNull TasksRepository tasksRepository) {        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null!");    }    @Override    protected void executeUseCase(RequestValues requestValues) {        mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {            @Override            public void onTasksLoaded(List tasks) {                int activeTasks = 0;                int completedTasks = 0;                // We calculate number of active and completed tasks                for (Task task : tasks) {                    if (task.isCompleted()) {                        completedTasks += 1;                    } else {                        activeTasks += 1;                    }                }                ResponseValue responseValue = new ResponseValue(new Statistics(completedTasks, activeTasks));                getUseCaseCallback().onSuccess(responseValue);            }            @Override            public void onDataNotAvailable() {                getUseCaseCallback().onError();            }        });    }    public static class RequestValues implements UseCase.RequestValues {    }    public static class ResponseValue implements UseCase.ResponseValue {        private final Statistics mStatistics;        public ResponseValue(@NonNull Statistics statistics) {            mStatistics = checkNotNull(statistics, "statistics cannot be null!");        }        public Statistics getStatistics() {            return mStatistics;        }    }}

代码不多。继承了UseCase。组合了TasksRepository,需要构造时传入,用于在executeUseCase()执行获取数据的操作。定义了两个静态内部类,分别实现请求和响应时要用的回调接口。

StatisticsContract —— 契约类,定义V、P的接口与方法
StatisticsPresenter ,部分代码:

public class StatisticsPresenter implements StatisticsContract.Presenter {    private final StatisticsContract.View mStatisticsView;    private final UseCaseHandler mUseCaseHandler;    private final GetStatistics mGetStatistics;    public StatisticsPresenter(            @NonNull UseCaseHandler useCaseHandler,            @NonNull StatisticsContract.View statisticsView,            @NonNull GetStatistics getStatistics) {        mUseCaseHandler = checkNotNull(useCaseHandler, "useCaseHandler cannot be null!");        mStatisticsView = checkNotNull(statisticsView, "StatisticsView cannot be null!");        mGetStatistics = checkNotNull(getStatistics,"getStatistics cannot be null!");        mStatisticsView.setPresenter(this);    }    @Override    public void start() {        loadStatistics();    }    private void loadStatistics() {       …    }}

组合了UseCaseHandler、用例GetStatistics、StatisticsContract.View(V)
mUseCaseHandler用于执行用例mGetStatistics,mStatisticsView显示视图

StatisticsFragment —— 实现StatisticsContract.View接口。依赖StatisticsContract.Presenter。在onResume()中,调用presenter的加载数据方法。

StatisticsActivity —— 初始化StatisticsFragment、StatisticsPresenter。

总结

相较于传统MVP,P不再直接操作M了,而是通过domain层的use case来操作。

更多相关文章

  1. 将Android项目导入到Eclipse开发环境
  2. 关于ADT(eclipse android)项目迁移到Android studio工具教程(上)
  3. Android音乐播放器开发小记——项目简介
  4. [Android]修改Android Studio项目的运行版本
  5. Android 官方示例:android-architecture 学习笔记(四)之todo-data
  6. Android必备:Android项目的目录结构
  7. Android封装jar包,把当前项目设置成module,封装手机振动jar包给uni
  8. Android开源项目解析:PullToRefresh
  9. Android:Serializable接口和Parcelable接口

随机推荐

  1. raspberryPi2 移植Android系统
  2. eclipse 和 android studio 快捷键对比
  3. 利用adb安装和卸载android APK
  4. Android中文API(97)—— ContextMenu
  5. UiModeManager设置夜间模式和行车模式
  6. unity3d 保存(截图、拍照)图片 到Android(
  7. 几个Android常见wraning警告处理方法
  8. 轻松玩转Camera,使用CameraView来拍照,修
  9. Android调用系统内部的下载程序下载文件(
  10. Android图像滤镜框架GPUImage使用(二)