android架構之一(todo-mvp).md

原文鏈接: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時已經完成

類圖如下:



去掉接口,簡化圖


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容