有多个片段的活动的MVP

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

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

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

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

  • Android MVP模式包结构
  • 如何在不使用Dagger的情况下使用MVP中的共享首选项并且不会导致Presenter与上下文相关?
  • Android MVP:在Presenter中安全使用Context
  • 如何使用适用于Android的MVP模式控制ListView
  • 用匕首在Android mvp上实现GoogleApiClient?
  • Android MVP - 如何在活动演示者和片段演示者之间进行通信
  • Android UI开发是否适合于独立的devise模式?
  • Android MVP:在Presenter中安全使用Context
  • 活动/片段应被视为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); } }