我正在开发一个使用干净架构的应用程序。在演示者中,当某些内容出现在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方法中吗?提前谢谢。
答案 0 :(得分:0)
如果要从另一个对象调用某个Activity的函数,则必须将Activity的引用传递给该对象。这意味着您需要将Activity参数添加到演示者的构造函数。
旁注
我知道您正在实施的内容在许多地方被称为“干净的架构”(包括Google的官方MVP教程),但您可能想阅读有关该主题的帖子,以便获得另一种观点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()
进行调用之后。