MVP-演示者比较:将视图注入构造函数与takeView(View v)/ dropView()

时间:2018-11-27 20:46:45

标签: java android dependency-injection mvp android-mvp

我已经在Android中看到了两种实现MVP模式的方法。两者都在Android Architecture Blueprints中使用:

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

    interface StartVersionPresenter {
        void start();
    }

    interface DropViewVersionPresenter {
        void takeView(View view);
        void dropView();
    }
}

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);
            }
        });
    }
}

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);
            }
        });
    }
}

takeView(Contract.View view)Fragment的{​​{1}}方法中被调用。 在onResume()的{​​{1}}方法中调用dropView()

在两种情况下,演示者都是通过Fragment的{​​{1}}方法创建的。

为什么在更多情况下而不是在第一种情况下使用第二种方法?我看到第一个比较简单,因为如果要在视图上调用该方法,则不必检查视图是否为null。

0 个答案:

没有答案