笔记: 昨天弄清楚 项目的架构,今天来看看具体细节是怎么实现的吧。
我们以“添加一个新的任务” 这个动作,作为我们研究的主线流程。
APP 上的我们要执行的操作是:点击 floatButton添加 → 输入 task 名称 → 点击 floatbutton 完成。所以首先我们找到 floatButton 的 onClick()
可以看到,作为 view 的 TasksFragment 持有了一个作为 presenter 的对象,在用户进行点击操作的时候 直接调用 presenter 的方法,将用户的 UI 事件转换成了具体的逻辑任务。然后我们跟随事件,来到 presenter 中看看下面的操作。(注:这里为了解耦 presenter 具体类对象是实现了 presenter 的操作接口)
我们在 TaskActivity 中找到了 传入的 presenter 实现类 ——TasksPresenter
1、TasksPresenter 实现了 TasksContract.Presenter 接口 用于实现TasksPresenter 与 Fragment 的解耦。
2、通过 TaskView 接口的方法 使Fragment 持有了它本身(this)对象。
下面我们找到 addnewTask()方法
看到.....额.....通过 mTasksView 的接口方法又回调给了 view层 (当前的 view 层 就是 TasksFragment),好吧 我们再回去。(其实如果 app 复杂一些在这里会执行一些操作,比如获取未编辑完成的 task,或者加载一些个性化的东西 )
找到 showAddTask()方法 看到,在这里跳转到了一个新的 activity 中来执行对这个新 task 的编辑操作。好像 intent 也没有带什么数据过去。就这么直接去了...
AddEditTaskActivity 与 TasksActivity 很类似。 这里出现了另一个 MVP 结构单元
Injection.provideTasksRepository —— AddEditTaskFragment —— AddEditTaskPresenter
我们执行的动作 也只有一个,就是 点击 floatbutton 来保存我们新创建的 task
还是找到 floatbutton 的 onClick 监听
执行了 presenter 的 saveTask 操作 并传入了 两个 Title 与 description 两个 String 参数。
saveTask 的具体操作: 首先检查是否是新建任务
咦? 这 mTaskId 是什么鬼? 哈哈,我们回去 AddEditTaskActivity 中看看 Presenter 的定义部分
记得我们前面说了 , 在执行跳转的 Intent 什么都没有传过来,所以当我们在创建一个新的 task 时 这个 taskId 一定是空的。那么接下来就会执行 creatTask()了
如果新创建的 task 是有效的 首先通过 TasksRepository 来将 task 保存到数据中,这里是 presenter 对 model 进行了调用操作 并且是由 presenter 持有 model 的对象。
saveTask 的操作 ,分别 task 保存到 远端 本地 以及 缓存中。保存完成后 执行了AddTaskView 接口的 showTaskList 操作 通知 UI(当前的 view 是 AddEditTaskFragment)进行先一步操作
好,一整套添加新 task 的流程走完。我们总结一下 各部分的职责吧
首先 view 层 与 presenter 层 是相互持有,这样来达到交流的作用,view 层负责接收和展示。
然后 presenter 层与 Respository层(或者 Model)为单向持有,就是说只能是由 presenter 来控制从 model 层得到什么,或者给 model 层什么,而 model 只能服从。presenter 来负责怎么处理问题。
而 model 层就是执行者,处理有 persenter 将问题细化后的各项任务,并通过回调 来告知 presenter 执行结果。