2016-11-16 3 views
1

Я пытаюсь разработать приложение, используя 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 принимается, элементы пользовательского интерфейса, которые нуждаются в обновлении, не существует больше ,

Как я могу это достичь? Это даже правильный способ сделать это?

ответ

0

ли mUnbinder = ButterKnife.bind(this, view); либо в onCreateView() или, если вы предпочитаете, чтобы сделать это в onViewCreated() на вызов mUnbinder = ButterKnife.bind(this, view); перед вызовом super.onViewCreated().

КПП. Использование EventBus для этого звучит болезненно. Почему бы просто не иметь класс, например UserMananger, где вы можете получить текущий аутентифицированный пользователь или null, если пользователь не прошел аутентификацию. Кроме того, поскольку вы используете RxJava, было бы целесообразно включить UserManager в цепочку/поток RxJava на каждом экране.

+0

Спасибо, вы можете расширить его на последней части? Включая UserManager в мою цепочку RxJava? В конце концов я создал UserManager, поэтому мне интересно об этом. –