MVP - Presenter 比较:构造函数中注入的视图与 takeView(View v) / dropView()

App*_*evo 5 java mvp android dependency-injection android-mvp

我见过 Android 中 MVP 模式的两种方法。两者都在Android 架构蓝图中使用:

public interface Contract {
    interface View {
        void showData(String data);
    }

    interface StartVersionPresenter {
        void start();
    }

    interface DropViewVersionPresenter {
        void takeView(View view);
        void dropView();
    }
}
Run Code Online (Sandbox Code Playgroud)

1)通过构造函数注入视图的演示者:

public class StartVersionPresenter implements Contract.StartVersionPresenter {

    private final Contract.View view;
    private final Repository repository;

    public StartVersionPresenter(Contract.View view, Repository repository) {
        this.view = view;
        this.repository = repository;
    }

    @Override
    public void start() {
        loadData();
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                view.showData(someData);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

start()onResume() Fragment在的方法中调用。

2)通过方法(takeView(在我的示例中)

public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
    private final Repository repository;
    private Contract.View view;

    public DropViewVersionPresenter(Repository repository) {
        this.repository = repository;
    }


    @Override
    public void takeView(Contract.View view) {
        this.view = view;
        loadData();
    }

    @Override
    public void dropView() {
        view = null;
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                if (view != null)
                    view.showData(someData);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

takeView(Contract.View view)Fragment在的方法中调用onResume()dropView()Fragment在的方法中调用onDestroy()

在这两种情况下,演示者都是在以下位置创建的FragmentonCreate()方法中创建的。

为什么第二种方法比第一种方法用得更多?我可以看到第一个更简单,因为如果我们想调用视图上的方法,则不必检查视图是否不为空。