2016-11-16 62 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(); 


     } 
    }; 

我的想法是,對於每一個畫面,一旦它被加載,它就可以通過EventBus訂閱檢索UserInfo。

問題是 - 這個事件到達兒子。按照莫斯自己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響應接收,需要更新的UI元素不存在了。

我該如何做到這一點?這甚至是正確的方式嗎?

回答

0

調用super.onViewCreated()之前執行mUnbinder = ButterKnife.bind(this, view);無論是在onCreateView()或者,如果你喜歡做,在onViewCreated()通話mUnbinder = ButterKnife.bind(this, view);

Btw。使用EventBus聽起來很痛苦。爲什麼不只是像UserMananger那樣可以獲得當前認證用戶的課程,或者如果用戶未通過認證,則爲空。另外,由於您使用的是RxJava,因此將UserManager包含在每個屏幕上的RxJava鏈/流中是有意義的。

+0

謝謝,你可以擴展最後一部分?在我的RxJava鏈中包含UserManager?我最終創建了一個UserManager,所以我對此感到好奇。 –