2016-11-16 71 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,所以我对此感到好奇。 –