Android 官方示例:android-architecture 学习笔记(五)之todo-mvp-clean
来源:互联网 发布:单词带读软件 编辑:程序博客网 时间:2024/06/11 20:05
项目地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/
项目结构
本项目的理念基于Clean Architecture.
项目架构基于基本的MVP示例。添加了domain 层,在 presentation层和 repositories层之间。总体就将App分成了三层:
层次说明
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 <V extends UseCase.ResponseValue> void notifyResponse(final V response, final UseCase.UseCaseCallback<V> useCaseCallback); //错误通知给callback <V extends UseCase.ResponseValue> void onError( final UseCase.UseCaseCallback<V> useCaseCallback);}
UseCaseThreadPoolScheduler —— UseCaseScheduler的实现类
还有一个prod或mock源目录(取决于build variant)下的 Injection类。使用依赖注入的方式,提供获取各种use case类型的访问方法。
statistics模块
包结构:
先来看下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<Task> 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来操作。
- Android 官方示例:android-architecture 学习笔记(五)之todo-mvp-clean
- Android 官方示例:android-architecture 学习笔记(二)之todo-mvp
- Android 官方示例:android-architecture 学习笔记(三)之todo-mvp-loaders
- Android 官方示例:android-architecture 学习笔记(六)之todo-mvp-contentproviders
- Android 官方示例:android-architecture 学习笔记(四)之todo-databinding
- Android-Architecture之todo-mvp
- 【android-architecture】todo-mvp
- Android官方架构项目之MVP + Clean 学习
- Android官方架构项目之MVP + Clean
- Google官方MVP示例之TODO-MVP
- Google官方MVP示例之TODO-MVP
- android-architecture学习——todo‑mvp
- Android 官方示例:android-architecture 学习笔记(一)
- Google 的android-architecture,todo-mvp解析
- Google官方MVP翻译示例之TODO-MVP
- Android官方MVP示例学习分析
- Android官方MVP+Loader示例学习
- 【android-architecture】TODO-DataBinding
- Java集合系列(10)--TreeSet
- poj Babelfish(二分||map)
- Java Fundamental day03
- 40、Linux初步(CentOS 7下安装配置FTP)
- Hibernate核心API的详解
- Android 官方示例:android-architecture 学习笔记(五)之todo-mvp-clean
- 面试感悟----一名3年工作经验的程序员应该具备的技能
- 如何高效学习
- 【SPOJ 375】Query on a tree&树链剖分详解
- Spring注解@Component、@Repository、@Service、@Controller区别
- Android 视频播放器I
- arm-none-linux-gnueabi-gcc command not found[Solved]
- 基本数据类型包装类
- 体绘制(VR)图像的阈值调节