Я пытаюсь разработать приложение, используя Mosby и EventBus. Первое событие, которое я хочу иметь, - это вход в систему после входа в систему, создавая липкое событие, чтобы каждый экран мог всегда получать доступ к информации о пользователе.Mosby & EventBus
Основе почтовый образец Мосби, у меня есть BasePresenter вроде этого:
public abstract class EventBusPresenter<V extends MvpView> extends MvpBasePresenter<V> {
private static final java.lang.String TAG = tag(EventBusPresenter.class);
@Inject
protected EventBus mEventBus;
LoginSuccessfulEvent userInfo;
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onLoginSuccessful(LoginSuccessfulEvent event) {
MCLog.i(TAG, "Received a login event!");
userInfo = event;
onLoginReceived(event);
}
protected abstract void onLoginReceived(LoginSuccessfulEvent e);
public LoginSuccessfulEvent getUserInfo(){
return userInfo;
}
@Override
public void attachView(V view) {
super.attachView(view);
mEventBus.register(this);
}
@Override
public void detachView(boolean retainInstance) {
super.detachView(retainInstance);
mEventBus.unregister(this);
}
}
Когда логины я использую этот код:
public void doLogin(String username, String password) {
if (isViewAttached()) {
getView().showLoading();
}
cancelSubscription();
mSubscriber = new Subscriber<AuthenticationResponse>() {
@Override
public void onCompleted() {
if (isViewAttached()) {
getView().loginSuccessful();
}
}
@Override
public void onError(Throwable e) {
if (isViewAttached()) {
getView().showLoginError();
}
}
@Override
public void onNext(AuthenticationResponse authenticationResponse) {
User user = authenticationResponse.getUser();
MCLog.w(TAG, String.format("Login was successful with user: %s", user));
mEventBus.postSticky(new LoginSuccessfulEvent(user, authenticationResponse.getToken()));
String token = authenticationResponse.getToken();
MCLog.i(TAG, String.format("Token obtained = %s", token));
mSharedPreferences.edit().putString(PreferenceKeys.TOKEN_KEY, token).apply();
}
};
Моя идея заключается в том, что для каждого экрана, как вскоре после его загрузки он может получить UserInfo через подписку EventBus.
Вопрос - это событие прибывает слишком сыном. По собственному классу BaseFragment Мосби Я делаю это:
public abstract class BaseFragment<V extends MvpView, P extends MvpPresenter<V>> extends MvpFragment<V, P> {
private Unbinder mUnbinder;
@LayoutRes
protected abstract int getLayoutRes();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(getLayoutRes(), container, false);
}
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
inject();
super.onViewCreated(view, savedInstanceState);
mUnbinder = ButterKnife.bind(this, view);
}
@Override public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}
/**
* Inject dependencies
*/
protected void inject() {
}
}
Это означает, что инъекции поступает до мнения созданы, поэтому всякий раз, когда я пытаюсь ответить на LoginEvent принимается, элементы пользовательского интерфейса, которые нуждаются в обновлении, не существует больше ,
Как я могу это достичь? Это даже правильный способ сделать это?
Спасибо, вы можете расширить его на последней части? Включая UserManager в мою цепочку RxJava? В конце концов я создал UserManager, поэтому мне интересно об этом. –