1亮隙、Github地址:https://github.com/googlesamples/android-architecture
里面有幾個(gè)項(xiàng)目虑润,這里下載的 todo-mvp 是比較基礎(chǔ)的項(xiàng)目犬庇。
2父丰、項(xiàng)目結(jié)構(gòu)
這里先不管它們都是干嘛的哀九,通過觀察發(fā)現(xiàn)包下都包含這幾類:
xxxActivity荡碾,
xxxFragment晶府,
xxxContract星持,
xxxPresenter危喉。
所以這個(gè)項(xiàng)目應(yīng)該是按照不同界面來組織的宋渔。
其中xxxActivity,xxxFragment就是MVP中的V辜限,xxxPresenter就是MVP中的P了皇拣。xxxContract是什么呢?以addedittask包下的AddEditTaskContract.java為例看下代碼
public interface AddEditTaskContract {
interface View extends BaseView<Presenter> {
void showEmptyTaskError();
void showTasksList();
...
}
interface Presenter extends BasePresenter {
void createTask(String title, String description);
void updateTask( String title, String description);
...
}
}
是一個(gè)接口薄嫡,里面又定義了兩個(gè)接口氧急,并分別繼承了BaseView類和BasePersenter類
BaseView類
public interface BaseView<T> {
void setPresenter(T presenter);
}
BasePersenter類
public interface BasePresenter {
void start();
}
那么View和Persenter又被誰實(shí)現(xiàn)了呢?
Persenter毫無疑問是被XXXPersenter實(shí)現(xiàn)了毫深,View是不是XXXActivity實(shí)現(xiàn)了呢吩坝?不是的,BaseView被XXXFragment實(shí)現(xiàn)了费什,而XXXActivity是負(fù)責(zé)創(chuàng)建XXXFragment和XXXPersenter钾恢,并將它們聯(lián)系起來的。
最后是MVP的M了鸳址,它在項(xiàng)目的data包下
其中Task.java是存放數(shù)據(jù)的實(shí)體類瘩蚪,
TasksDataSource是個(gè)接口,里面有定義了兩個(gè)接口稿黍,用來和Personter聯(lián)系疹瘦。
TasksDataSource
public interface TasksDataSource {
interface LoadTasksCallback {
void onTasksLoaded(List<Task> tasks);
void onDataNotAvailable();
}
interface GetTaskCallback {
void onTaskLoaded(Task task);
void onDataNotAvailable();
}
void getTasks(@NonNull LoadTasksCallback callback);
void getTask(@NonNull String taskId, @NonNull GetTaskCallback callback);
...
}
TasksRepository實(shí)現(xiàn)了TasksDataSource,負(fù)責(zé)處理 Task 數(shù)據(jù)巡球。
public class TasksRepository implements TasksDataSource {
...
}
小結(jié)
這個(gè)項(xiàng)目的結(jié)構(gòu)就差不多完了言沐,流程分為這幾步
1.Activity 將分別實(shí)現(xiàn)了 Persenter 和 View 的 XXXPersonter 和 XXXFragment 聯(lián)系起來邓嘹。
2.Persenter 通過 TasksDataSource 內(nèi)的接口和 TasksRepository 聯(lián)系起來。
3.XXXFragment觸發(fā)點(diǎn)擊事件险胰,調(diào)用XXXPersenter 方法汹押,XXXPersenter處理業(yè)務(wù)邏輯(例如效果圖第二步,要判斷Title或內(nèi)容是否為空)起便,XXXPersonter再通過 TasksReoisitory 將數(shù)據(jù)存入 Task中棚贾。
4.TasksReoisitory 通過回調(diào)再將 Task 數(shù)據(jù) 返回給 XXXPersenter,XXXPersenter 再專遞給 XXXFragment 完成數(shù)據(jù)展示