Android MVP MVVM框架梳理 (二)
Android MVP框架梳理 梳理下Google推荐的MVP MVVM Demo
源码Git地址
- todo‑mvp
- todo‑mvp‑clean
- todo‑mvp‑dagger
- todo‑mvp‑rxjava
- todo‑mvvm‑databinding
- todo‑mvvm‑live
todo‑mvp‑clean
todo‑mvp‑clean源码Git地址
todo‑mvp‑clean与todo‑mvp对比
- todo‑mvp‑clean在Presenter和TasksDataSource 之间加入了Domail Layout层 该层中可以减少Presenter的代码 使逻辑更清晰
- todo‑mvp‑clean加入了UseCase和UseCaseHandler的机制 在非UI线程进行逻辑操作 在UI线程进行界面刷新
todo‑mvp‑clean结构图
todo‑mvp‑clean逻辑梳理
todo‑mvp‑clean与todo‑mvp只是在Presenter和TasksDataSource之间逻辑处理有了变化 只梳理这部分的流程
/**
* Presenter层调用UseCaseHandler去执行逻辑处理
* 处理完回调上层结果 通知界面刷新
*
* @param title
* @param description
*/
private void createTask(String title, String description) {
Task newTask = new Task(title, description);
if (newTask.isEmpty()) {
mAddTaskView.showEmptyTaskError();
} else {
mUseCaseHandler.execute(mSaveTask, new SaveTask.RequestValues(newTask),
new UseCase.UseCaseCallback<SaveTask.ResponseValue>() {
@Override
public void onSuccess(SaveTask.ResponseValue response) {
mAddTaskView.showTasksList();
}
@Override
public void onError() {
showSaveError();
}
});
}
}
/**
* 每个Presenter对应一个UseCaseHandler
* UseCaseHandler中进行具体的逻辑处理
*
* @param useCase
* @param values
* @param callback
* @param <T>
* @param <R>
*/
public <T extends UseCase.RequestValues, R extends UseCase.ResponseValue> void execute(
final UseCase<T, R> useCase, T values, UseCase.UseCaseCallback<R> callback) {
//设置请求过程中需要的参数
useCase.setRequestValues(values);
//设置请求完成后的回调
useCase.setUseCaseCallback(new UiCallbackWrapper(callback, this));
EspressoIdlingResource.increment();
//逻辑处理放在非UI线程
mUseCaseScheduler.execute(new Runnable() {
@Override
public void run() {
useCase.run();
if (!EspressoIdlingResource.getIdlingResource().isIdleNow()) {
EspressoIdlingResource.decrement();
}
}
});
}
/**
* 具体的业务处理
* GetTasks.java
*
* @param values 上层传来的参数
*/
@Override
protected void executeUseCase(final RequestValues values) {
if (values.isForceUpdate()) {
mTasksRepository.refreshTasks();
}
//此逻辑在非UI线程执行
//并对数据仓储设置回调
mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {
@Override
public void onTasksLoaded(List<Task> tasks) {
TasksFilterType currentFiltering = values.getCurrentFiltering();
TaskFilter taskFilter = mFilterFactory.create(currentFiltering);
List<Task> tasksFiltered = taskFilter.filter(tasks);
ResponseValue responseValue = new ResponseValue(tasksFiltered);
//处理结果回调上层进行处理( mAddTaskView.showTasksList();)
getUseCaseCallback().onSuccess(responseValue);
}
@Override
public void onDataNotAvailable() {
处理结果回调上层进行处理( showSaveError();)
getUseCaseCallback().onError();
}
});
}