2016-11-16 5 views
1

MosbyとEventBusを使用してアプリケーションを開発しようとしています。最初のイベントは、ユーザーのログイン後に、スティッキーなイベントを作成して、すべての画面が常にログイン情報にアクセスできるようにすることです。私はこのコードを使用するユーザーログインするとMosby&EventBus

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(); 


     } 
    }; 

ですモスビーメールサンプルをオフに基づいて

は、私はこのようなBasePresenterを持っていますすぐにロードされると、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

onCreateView()またはあなたがsuper.onViewCreated()を呼び出す前にmUnbinder = ButterKnife.bind(this, view);onViewCreated()で呼び出していることを行うことを好む場合はどちらかmUnbinder = ButterKnife.bind(this, view);を行います。

Btw。 EventBusを使ってその音が痛いです。今すぐ認証されたユーザーを取得できる場所のUserManangerなどのクラスを持たないのはなぜですか。ユーザーが認証されていない場合はnullです。また、RxJavaを使用しているので、各スクリーンのRxJavaチェーン/ストリームにUserManagerを含めることが理にかなっています。

+0

ありがとうございます、最後の部分を展開できますか?私のRxJavaチェーンにUserManagerを含める?私は最終的にUserManagerを作成しましたので、これについて興味があります。 –

関連する問題