2016-12-02 9 views
0

私はRxを利用するためにライブラリ内のメソッドを書き換えています。以下のコード例は元のメソッドです。Rxを利用するための接続方法の書き換え

public void connect(ConnectionListener connectionListener) { 

    //...... 

    RxBleDevice device = mRxBleClient.getBleDevice(builder.toString()); 

    mEstablishedConnection = device.establishConnection(mContext, false) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(throwable -> { 
       throwable.printStackTrace(); 
       connectionListener.onFailed(); 
       Log.d(TAG, "Error establishing a connection" + throwable.getMessage()); 
      }) 
      .subscribe(rxBleConnection -> { 
       mConnection = rxBleConnection; 
       connectionListener.onConnected(); 
       setNotifications(); 
       Log.d(TAG, "Connection established. Status: " + device.getConnectionState().toString()); 
      }, throwable -> { 
       if (throwable != null) { 
        throwable.printStackTrace(); 
       } 
      }); 
} 

私が最初に行くmEstablishedConnectionに保存するのではなく、Subscriptionを返すようにしました。これは、ユーザーが切断をトリガーするために退会することができるようになる:上記と

public Subscription connect() { 

    //.. 

    RxBleDevice device = mRxBleClient.getBleDevice(builder.toString()); 

    return device.establishConnection(mContext, false) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(throwable -> { 
       throwable.printStackTrace(); 
       Log.d(TAG, "Error establishing a connection" + throwable.getMessage()); 
      }) 
      .flatMap(rxBleConnection -> { 
       mConnection = rxBleConnection; 
       return Observable.empty(); 
      }) 
      .subscribe(o -> { 
       setNotifications(); 
       Log.d(TAG, "Connection established. Status: " + device.getConnectionState().toString()); 
      }, throwable -> { 
       if (throwable != null) { 
        throwable.printStackTrace(); 
       } 
      }); 
} 

問題は、私はきちんと戻って行うことがいいだろう、呼び出し元にエラーを伝播することができないということです。このメソッドをリアクティブにして呼び出し元にエラーを受けさせ、サードパーティクラスのRxBleConnectionを返すのではなく、このメソッドを書き直すにはどうすればよいですか?

答えて

1

適切な答えは、主に達成したいインターフェイスによって異なります。あなた自身のインターフェイスの中にRxBleConnectionをラップすることができます。呼び出し側がObservableに加入する責任があります(したがって、退会することができるようになります)と内部(RxBleConnection)を知ることができません。ここ

public Observable<YourWrapperClass> connect() { 
    RxBleDevice device = // ... 
    return device.establishConnection(context, false) 
     .doOnNext(connection -> { 
      setNotifications(connection) // pass the connection to setNotifications() 
      mConnection = connection // store the mConnection if it is a must - in the reactive approach objects are meant to be passed instead of stored 
     }) 
     .map(connection -> new YourWrapperClass(connection)) 
} 

: それはこのように好きでした。

+0

これは私が考えていたものです。私はこれを行かせます。 – Orbit

関連する問題