0

我正在开发一个使用干净架构的应用程序。在演示者中,当涉及到方法 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 方法中吗?提前致谢。

4

2 回答 2

0

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

边注

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

为什么 Android 中的 Activity 不是 UI 元素

Android 中的 MVC 和 MVP 架构模式

于 2016-10-13T09:21:32.657 回答
0

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

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

放置在Dagger 模块和 Dagger 组件初始化中的IView构造函数CheckInPresenter和更新提供者方法中。CheckInPresenterActivity

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

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()

于 2016-10-13T09:33:43.903 回答