原文鏈接:https://github.com/googlesamples/android-architecture/tree/todo-mvp/
概要
此篇架構是介紹純粹的mvp模式,不包含任何框架,數據通過手工注入,異步任務通過回調完成。
鏈接包含完整的項目示例,由google工程師維護。
職責:
- contact:定義 view 和 presenter
- activity:負責Views(fragments)和presenters的創建
- fragment:實現view接口
- presenter:實現presenter接口
一般情況,
業務邏輯在presenter,依賴view來做UI操作;
view幾乎不含邏輯,將presenter的命令變為UI動作,監聽用戶操作,傳遞給presenter處理
contacts 用來定義views和presenters之間的聯系
代碼分析:
TasksActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tasks_act);
...省略
TasksFragment tasksFragment =
(TasksFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
if (tasksFragment == null) {
// Create the fragment
tasksFragment = TasksFragment.newInstance();
ActivityUtils.addFragmentToActivity(
getSupportFragmentManager(), tasksFragment, R.id.contentFrame);
}
// Create the presenter
mTasksPresenter = new TasksPresenter(
Injection.provideTasksRepository(getApplicationContext()), tasksFragment);
...省略
}
在activity中創建fragment和presenter的實例
TasksFragment.java
public class TasksFragment extends Fragment implements TasksContract.View {
private TasksContract.Presenter mPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListAdapter = new TasksAdapter(new ArrayList<Task>(0), mItemListener);
}
@Override
public void onResume() {
super.onResume();
mPresenter.start();
}
@Override
public void setPresenter(@NonNull TasksContract.Presenter presenter) {
mPresenter = checkNotNull(presenter);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.tasks_frag, container, false);
...省略
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mPresenter.loadTasks(false);
}
});
...省略
return root;
}
}
fragment實現view接口,通過setPresenter()獲取presenter的引用,通過presenter加載數據。
TasksPresenter.java
public class TasksPresenter implements TasksContract.Presenter {
private final TasksRepository mTasksRepository;
private final TasksContract.View mTasksView;
public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");
mTasksView.setPresenter(this);
}
}
實現presenter接口,通過構造方法獲取view(fragment)的引用,同時將自身的引用傳遞給view(fragment)。
這在activity中實例化presenter時已經完成
類圖如下:
去掉接口,簡化圖