基于Google samples-TODO-MVP項(xiàng)目
前一篇解析:Google samples-MVP(todo APP)解析
本項(xiàng)目源碼:todo-mvp-loaders
官方結(jié)構(gòu)圖
具體類結(jié)構(gòu)
執(zhí)行流
- TasksActivity 創(chuàng)建TasksPresenter罗售。
TasksLoader tasksLoader = new TasksLoader(getApplicationContext(), repository);
mTasksPresenter = new TasksPresenter(
tasksLoader,
getSupportLoaderManager(),
repository,
tasksFragment
);
- 當(dāng)TasksActivity調(diào)用onResume()時(shí)虐沥,執(zhí)行presenter.start()虹统,其中調(diào)用了initLoader(int, Bundle,LoaderManager.LoaderCallbacks),第一個(gè)參數(shù)為Loader的唯一指定Id馅而,第三個(gè)參數(shù)為LoaderCallbacks涯雅,因?yàn)門asksPresenter實(shí)現(xiàn)了LoaderCallbacks,所以傳入this。調(diào)用initLoader有兩個(gè)可能結(jié)果:第一,存在符合第一個(gè)參數(shù)所指定的Loader酒朵,則返回該Loader;第二扎附,不存在指定Loader蔫耽,則調(diào)用第三個(gè)參數(shù)傳入的LoaderCallbacks.onCreateLoader()創(chuàng)建并返回新的Loader(此處Presenter返回TasksLoader mLoader)。不管是何種結(jié)果留夜,調(diào)用完成后會連接Loader和LoaderCallbacks匙铡,若Loader狀態(tài)改變則會回調(diào)該callback。
(TasksActivity)
@Override
public void onResume() {
super.onResume();
mPresenter.start();
}
(TasksPresenter)
@Override
public void start() {
mLoaderManager.initLoader(TASKS_QUERY, null, this);
}
- TasksLoader實(shí)現(xiàn)AsyncTaskLoader中的loadInBackground香伴。
@Override
public List<Task> loadInBackground() {
return mRepository.getTasks();
}
- 當(dāng)loadInBackground()執(zhí)行完畢慰枕,會調(diào)用回調(diào)方法中的onLoadFinished(),將取得的數(shù)據(jù)放入Presenter中即纲,至此具帮,Presenter獲得數(shù)據(jù)并可對其進(jìn)行操作。
@Override
public void onLoadFinished(Loader<List<Task>> loader, List<Task> data) {
mTasksView.setLoadingIndicator(false);
mCurrentTasks = data;
if (mCurrentTasks == null) {
mTasksView.showLoadingTasksError();
} else {
showFilteredTasks();
}
}