【问题标题】:How to call Activity method from Presenter in Clean architecture?如何在 Clean 架构中从 Presenter 调用 Activity 方法?
【发布时间】:2016-10-13 08:54:15
【问题描述】:

我正在开发一个使用干净架构的应用程序。在演示者中,当涉及到方法 onCompleted 时,我必须从 Main 活动中调用函数。 这是我的演示者:

public class CheckInPresenter implements Presenter {

    UseCase postCheckInUseCase;
    Context context;

    @Inject
    CheckInPresenter(@Named("putCheckIn") UseCase postCheckInUseCase){
        this.postCheckInUseCase = postCheckInUseCase;
    }

    public void initialize(){this.initializeCheckIn();}
    public void initializeCheckIn(){this.putCheckIn();}
    public void putCheckIn(){
        this.postCheckInUseCase.execute(new CheckInSubscriber());

    }

    @Override
    public void resume() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void destroy() {

    }
    private final class CheckInSubscriber extends DefaultSubscriber<EventEntity>{
        @Override
        public void onCompleted() {

            Log.d("onCompleted", "OnCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.d("onError", "OnError: " + e.getMessage());
        }

        @Override
        public void onNext(EventEntity eventEntity) {

            Log.d("onNext", "OnNext");
        }
    }
}

这是我必须调用的 MainActivity 函数:

public void getDataForToolbar() {
        SharedPreferences sharedPreferences = getSharedPreferences(getResources().getString(R.string.Account_json), Context.MODE_PRIVATE);
        final String account = sharedPreferences.getString(getResources().getString(R.string.account_json), null);

        if (account != null) {
            Gson gson = new Gson();
            mAccount = gson.fromJson(account, AccountModel.class);

            for (CompanyModel com : mAccount.getCompanies()) {
                String name = com.getName();
                company_name.setText(name);
                logo_url = com.getLogo_url();
            }
            if (logo_url == null || logo_url.isEmpty()) {
                Picasso
                        .with(this)
                        .load(R.drawable.default_company)
                        .resize(70, 58)
                        .transform(new RoundedTransformation(8, 0))
                        .into(toolbarImage);
            } else {
                picassoLoader(this, toolbarImage, logo_url);
            }
            String username = mAccount.getUsername();
            if(mAccount.getStatus()){
                aUsername.setText(username + "/" + getResources().getString(R.string.on_duty));
                aUsername.setBackgroundColor(ContextCompat.getColor(mContext, R.color.colorGreen));
            }else{
                aUsername.setText(username + "/" + getResources().getString(R.string.off_duty));
                aUsername.setBackgroundColor(ContextCompat.getColor(mContext, R.color.colorWhite));
            }

        }
    }

有人可以帮助我如何在 Presenter 中将此函数调用到我的 onCompleted 方法中吗?提前致谢。

【问题讨论】:

    标签: java android clean-architecture


    【解决方案1】:

    如果您想从另一个对象调用某个 Activity 的函数,您必须将 Activity 的引用传递给该对象。这意味着您需要在演示者的构造函数中添加 Activity 参数。

    旁注

    我知道在很多地方(包括 Google 的官方 MVP 教程),您正在实现的东西被称为“干净的架构”,但您可能想阅读我关于该主题的帖子,以便获得另一种观点Android 上的“干净”应该是什么样子。

    Why activities in Android are not UI elements

    MVC and MVP architectural patterns in Android

    【讨论】:

      【解决方案2】:

      创建接口 IView 并让你的 Activity 来实现它。 在IView中创建方法void getDataForToolbar();

      我在您的CheckInPresenter 中看到@Inject 注释,因此如果您使用的是 Dagger 2,请使用 IView 更新 Dagger 模块的构造函数,为其创建一个提供程序方法并在此模块中为CheckInPresenter 提供它。

      IView 放在CheckInPresenter 的构造函数中,并更新Dagger 模块中CheckInPresenter 的提供程序方法,并在您的Activity 中初始化Dagger 组件。

      例如,它可能看起来像这样:

      public class YourActivity implements IView {
          ...
      }
      
      @Module
      public class YourModule {
      
          private IView view;
      
          public YourModule(IView view) {
              this.view = view;
          }
      
          @Provides 
          public IView provideView() {
              return view;
          }
      
          @Provides 
          @YourScope
          public Presenter providePresenter() {
              return new YourPresenter(view);
          }
      }
      

      只需使用 IView 完成您现有的 Presenter 和 Module。 在您的onCompleted 方法view.getDataForToolbar() 中调用之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        相关资源
        最近更新 更多