基于Google samples-TODO-MVP项目
前一篇解析:Google samples-MVP(todo APP)解析
本项目源码:todo-mvp-loaders
官方结构图
具体类结构
执行流
- TasksActivity 创建TasksPresenter。
TasksLoader tasksLoader = new TasksLoader(getApplicationContext(), repository);
mTasksPresenter = new TasksPresenter(
tasksLoader,
getSupportLoaderManager(),
repository,
tasksFragment
);
- 当TasksActivity调用onResume()时,执行presenter.start(),其中调用了initLoader(int, Bundle,LoaderManager.LoaderCallbacks),第一个参数为Loader的唯一指定Id,第三个参数为LoaderCallbacks,因为TasksPresenter实现了LoaderCallbacks,所以传入this。调用initLoader有两个可能结果:第一,存在符合第一个参数所指定的Loader,则返回该Loader;第二,不存在指定Loader,则调用第三个参数传入的LoaderCallbacks.onCreateLoader()创建并返回新的Loader(此处Presenter返回TasksLoader mLoader)。不管是何种结果,调用完成后会连接Loader和LoaderCallbacks,若Loader状态改变则会回调该callback。
(TasksActivity)
@Override
public void onResume() {
super.onResume();
mPresenter.start();
}
(TasksPresenter)
@Override
public void start() {
mLoaderManager.initLoader(TASKS_QUERY, null, this);
}
- TasksLoader实现AsyncTaskLoader中的loadInBackground。
@Override
public List<Task> loadInBackground() {
return mRepository.getTasks();
}
- 当loadInBackground()执行完毕,会调用回调方法中的onLoadFinished(),将取得的数据放入Presenter中,至此,Presenter获得数据并可对其进行操作。
@Override
public void onLoadFinished(Loader<List<Task>> loader, List<Task> data) {
mTasksView.setLoadingIndicator(false);
mCurrentTasks = data;
if (mCurrentTasks == null) {
mTasksView.showLoadingTasksError();
} else {
showFilteredTasks();
}
}