如何从Clean Architecture中的Presenter调用Activity方法?

时间:2016-10-13 08:54:15

标签: java android clean-architecture

我正在开发一个使用干净架构的应用程序。在演示者中,当某些内容出现在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方法中吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

旁注

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

Why activities in Android are not UI elements

MVC and MVP architectural patterns in Android

答案 1 :(得分:0)

创建界面IView并使您的Activity实现它。 在IView中创建方法void getDataForToolbar();

我在@Inject中看到CheckInPresenter注释,因此如果您使用的是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()进行调用之后。