我有一个包含两个片段的活动.
activity(MainActivity
)从开放的天气api中检索数据.我已经实现MVP此,其中:
Model
包含所有响应对象从API
View
是Activity
Presenter
包含MainPresenter
,MainPresenterImpl
,MainView
,GetDataInteractor
和GetDataInteractorImpl
.
因此,活动从Web服务获取数据.两个片段都将显示活动中检索到的数据中的数据.
在这种情况下使用MVP的最佳做法是什么?我知道如何通过接口/回调在片段< - >活动之间传递数据,我的问题是在实现MVP时这种行为会改变吗?
活动/片段应该被视为MVP模型中的视图.这意味着他们应该只显示数据并接收用户交互.可以通过接口/回调来传递活动和片段.
但是,调用API服务不是活动/片段的责任.
演示者应负责调用api服务.
因此,演示者应该公开一种类似的方法loadXXX
,在内部它会调用服务.收到响应后,演示者应调用view.showXXX
服务结果.activity/fragment应调用此loadXXX
方法并实现showXXX
.
通常,会在活动/片段中创建或注入演示者.活动/片段必须实现由演示者公开的接口,并且演示者持有该接口的弱引用,以便它可以回调.
当用户与屏幕交互时,例如,onClick
在按钮上,活动/片段调用演示者中的相应方法,例如presenter.loadUserDetails()
,演示者告诉视图显示为加载,例如view.showAsLoading()
因为它必须做它的东西:可能验证某事物或从api服务加载数据,最后回调结果到视图,例如view.showUserDetails(userDetails)
.
总结一下MVP各部分代码中的一个例子:
Activity/Fragment仅代表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 WeakReferencemWeakView; 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); } }