Google samples-TODO-MVP-Loaders解析

基于Google samples-TODO-MVP项目
前一篇解析:Google samples-MVP(todo APP)解析
本项目源码:todo-mvp-loaders

官方结构图

Google samples-TODO-MVP-Loaders解析_第1张图片
mvp-loaders.png

具体类结构

Google samples-TODO-MVP-Loaders解析_第2张图片
类结构.png

执行流

  • 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 loadInBackground() {
        return mRepository.getTasks();
    }
  • 当loadInBackground()执行完毕,会调用回调方法中的onLoadFinished(),将取得的数据放入Presenter中,至此,Presenter获得数据并可对其进行操作。
    @Override
    public void onLoadFinished(Loader> loader, List data) {
        mTasksView.setLoadingIndicator(false);

        mCurrentTasks = data;
        if (mCurrentTasks == null) {
            mTasksView.showLoadingTasksError();
        } else {
            showFilteredTasks();
        }
    }

你可能感兴趣的:(Google samples-TODO-MVP-Loaders解析)