有多个片段的活动的MVP

我有一个有两个碎片的活动。

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

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

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

Solutions Collecting From Web of "有多个片段的活动的MVP"

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

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

主持人应该负责调用API服务。

所以,主持人应该公开一个像loadXXX这样的方法,在内部它会调用服务。 当收到响应时,演示者应该调用view.showXXX服务的结果。 activity / fragment应该调用这个loadXXX方法并实现showXXX

通常,演示者被创build或注入到活动/片段中。 活动/片段必须实现演示者公开的接口,演示者持有该接口的弱引用,以便callback。

当用户与屏幕交互时,例如onClickbutton,activity / fragment调用演示者的相应方法,例如presenter.loadUserDetails() ,演示者告诉视图显示为加载,例如view.showAsLoading()因为它必须做它的东西:也许validation一些东西或从api服务加载数据,最后callback结果到视图,例如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, eg make the Api call and finally call view.showUserDetails(userDetails); } } interface View { void showAsLoading(); void showUserDetails(UserDetails userDetails); } }