活动/片段应被视为MVP模型中的视图。这意味着他们应该只显示数据并接收用户交互。 可以通过接口/回调来传递活动和片段。
但是,调用API服务不是活动/片段的责任。
演示者应负责调用api服务。
因此,主持人应该公开一个方法,如loadXXX
,在内部它会打电话给服务。收到回复后,发言人应该拨打view.showXXX
以获得服务结果。活动/片段应调用此方法并实施showXXX
。
通常,演示者被创建或注入到活动/片段中。 活动/片段必须实现演示者公开的接口,并且演示者持有该接口的弱引用,以便它可以回调。
当用户与屏幕交互时,例如按钮上的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);
}
}
Just a我认为:我认为片段被视为视图(关于MVP),因此我想知道让一个演示者引用多个视图(或者更确切地说:他们的界面回调)在视图中最合适地显示不同的数据是很奇怪的为了那个原因?我认为演示者需要决定/指导哪个视图显示哪些数据?P.s。显然,一个视图的多个主持人是一种有效的方法,所以也许另一种方式也可以工作:http://stackoverflow.com/a/2068/1041533 – AgentKnopf
@AgentKnopf实际上,如此处所述http://programmers.stackexchange.com/a/261351/206366在MVP中,每位演示者负责呈现一个视图。演示者可以呈现多个视图的唯一方式是,如果不同的视图仅仅是绑定到演示者的单个视图界面的不同实现。 – Ari
@Ari谢谢你的跟进 - 这确实有道理! – AgentKnopf