具有多个片段的活动的MVP

时间:2015-12-13 23:57:39

标签: android android-fragments interface mvp

我有一个包含两个片段的活动。

活动(MainActivity)从开放天气api中检索数据。我为此实现了MVP,其中: Model包含来自API的所有响应对象 ViewActivity Presenter包含MainPresenterMainPresenterImplMainViewGetDataInteractorGetDataInteractorImpl

因此,活动从Web服务获取数据。两个片段都将显示活动中检索到的数据的数据。

在这种情况下使用MVP的最佳做法是什么?我知道如何在片段之间传递数据< - >通过接口/回调活动,我的问题是这个行为在实现MVP时是否会改变?

1 个答案:

答案 0 :(得分:17)

活动/片段应该被视为MVP模型中的视图。这意味着他们应该只显示数据并接收用户交互。 可以通过接口/回调来传递活动和片段。

但是,调用API服务不是活动/片段的责任。

演示者应负责调用api服务。

因此,演示者应该公开类似loadXXX的方法,在内部它会调用服务。收到回复后,演示者应使用服务结果调用view.showXXX。活动/片段应调用此loadXXX方法并实施showXXX

通常,会在活动/片段中创建或注入演示者。 activity / fragment必须实现由演示者公开的接口,并且演示者持有该接口的弱引用,以便它可以回调。

当用户与屏幕交互时,例如按钮上的onClick,活动/片段调用演示者中的相应方法,例如, presenter.loadUserDetails()演示者告诉视图显示为加载,例如view.showAsLoading()因为它必须做它的东西:可能验证某些东西或从api服务加载数据,最后回调结果到视图,例如view.showUserDetails(userDetails)

总结一个例子,在MVP的各个部分的代码中:

活动/片段仅代表MVP的观点:

public class MyActivity extends AppCompatActivity implements MyPresenter.View {
    private MyPresenter mPresenter;

    public onCreate() {
        ...
        mPresenter = new MyPresenter(this); // Or inject it and then set the view.
    }

    public void onClick(View v) {
        mPresenter.loadXXX(param1, param2);
    }

    // MyPresenter.View methods

    public void showAsLoading() {
        ...
    }

    public void showUserDetails(UserDetails userDetails) {
        ...
    }
}

型号:

public class UserDetails {
    ...
}

主讲人:

public class MyPresenter {

    private WeakReference<MyPresenter.View> mWeakView;

    public MyPresenter(MyPresenter.View view) {
        mWeakView = new WeakReference(view);
    }

    public void loadXXX(String param1, String param2) {
        MyPresenter.View view = mWeakView.get();
        if (view != null) {
            view.showAsLoading();
            // Do stuff, e.g. make the Api call and finally call view.showUserDetails(userDetails);
        }
    }

    interface View {
        void showAsLoading();
        void showUserDetails(UserDetails userDetails);
    }

}