99import java .util .Map ;
1010import java .util .TreeMap ;
1111
12+ import io .reactivex .BackpressureStrategy ;
13+ import io .reactivex .Flowable ;
14+ import io .reactivex .FlowableEmitter ;
1215import okhttp3 .Headers ;
1316import okhttp3 .OkHttpClient ;
1417import okhttp3 .Request ;
1518import okhttp3 .Response ;
1619import okhttp3 .WebSocket ;
1720import okhttp3 .WebSocketListener ;
1821import okio .ByteString ;
19- import rx .Observable ;
20- import rx .Subscriber ;
2122
2223/* package */ class OkHttpConnectionProvider implements ConnectionProvider {
2324
2728 private final Map <String , String > mConnectHttpHeaders ;
2829 private final OkHttpClient mOkHttpClient ;
2930
30- private final List <Subscriber <? super LifecycleEvent >> mLifecycleSubscribers ;
31- private final List <Subscriber <? super String >> mMessagesSubscribers ;
31+ private final List <FlowableEmitter <? super LifecycleEvent >> mLifecycleEmitters ;
32+ private final List <FlowableEmitter <? super String >> mMessagesEmitters ;
3233
3334 private WebSocket openedSocked ;
3435
3536
3637 /* package */ OkHttpConnectionProvider (String uri , Map <String , String > connectHttpHeaders , OkHttpClient okHttpClient ) {
3738 mUri = uri ;
3839 mConnectHttpHeaders = connectHttpHeaders != null ? connectHttpHeaders : new HashMap <>();
39- mLifecycleSubscribers = new ArrayList <>();
40- mMessagesSubscribers = new ArrayList <>();
40+ mLifecycleEmitters = new ArrayList <>();
41+ mMessagesEmitters = new ArrayList <>();
4142 mOkHttpClient = okHttpClient ;
4243 }
4344
4445 @ Override
45- public Observable <String > messages () {
46- Observable <String > observable = Observable .<String >create (subscriber -> {
47- mMessagesSubscribers .add (subscriber );
48-
49- }).doOnUnsubscribe (() -> {
50- Iterator <Subscriber <? super String >> iterator = mMessagesSubscribers .iterator ();
51- while (iterator .hasNext ()) {
52- if (iterator .next ().isUnsubscribed ()) iterator .remove ();
53- }
54-
55- if (mMessagesSubscribers .size () < 1 ) {
56- Log .d (TAG , "Close web socket connection now in thread " + Thread .currentThread ());
57- openedSocked .close (1000 , "" );
58- openedSocked = null ;
59- }
60- });
46+ public Flowable <String > messages () {
47+ Flowable <String > flowable = Flowable .<String >create (mMessagesEmitters ::add , BackpressureStrategy .BUFFER )
48+ .doOnCancel (() -> {
49+ Iterator <FlowableEmitter <? super String >> iterator = mMessagesEmitters .iterator ();
50+ while (iterator .hasNext ()) {
51+ if (iterator .next ().isCancelled ()) iterator .remove ();
52+ }
6153
54+ if (mMessagesEmitters .size () < 1 ) {
55+ Log .d (TAG , "Close web socket connection now in thread " + Thread .currentThread ());
56+ openedSocked .close (1000 , "" );
57+ openedSocked = null ;
58+ }
59+ });
6260 createWebSocketConnection ();
63- return observable ;
61+ return flowable ;
6462 }
6563
6664 private void createWebSocketConnection () {
@@ -112,29 +110,27 @@ public void onFailure(WebSocket webSocket, Throwable t, Response response) {
112110 }
113111
114112 @ Override
115- public Observable <Void > send (String stompMessage ) {
116- return Observable .create (subscriber -> {
113+ public Flowable <Void > send (String stompMessage ) {
114+ return Flowable .create (subscriber -> {
117115 if (openedSocked == null ) {
118116 subscriber .onError (new IllegalStateException ("Not connected yet" ));
119117 } else {
120118 Log .d (TAG , "Send STOMP message: " + stompMessage );
121119 openedSocked .send (stompMessage );
122- subscriber .onCompleted ();
120+ subscriber .onComplete ();
123121 }
124- });
122+ }, BackpressureStrategy . BUFFER );
125123 }
126124
127125 @ Override
128- public Observable <LifecycleEvent > getLifecycleReceiver () {
129- return Observable .<LifecycleEvent >create (subscriber -> {
130- mLifecycleSubscribers .add (subscriber );
131-
132- }).doOnUnsubscribe (() -> {
133- Iterator <Subscriber <? super LifecycleEvent >> iterator = mLifecycleSubscribers .iterator ();
134- while (iterator .hasNext ()) {
135- if (iterator .next ().isUnsubscribed ()) iterator .remove ();
136- }
137- });
126+ public Flowable <LifecycleEvent > getLifecycleReceiver () {
127+ return Flowable .<LifecycleEvent >create (mLifecycleEmitters ::add , BackpressureStrategy .BUFFER )
128+ .doOnCancel (() -> {
129+ Iterator <FlowableEmitter <? super LifecycleEvent >> iterator = mLifecycleEmitters .iterator ();
130+ while (iterator .hasNext ()) {
131+ if (iterator .next ().isCancelled ()) iterator .remove ();
132+ }
133+ });
138134 }
139135
140136 private TreeMap <String , String > headersAsMap (Response response ) {
@@ -154,14 +150,14 @@ private void addConnectionHeadersToBuilder(Request.Builder requestBuilder, Map<S
154150
155151 private void emitLifecycleEvent (LifecycleEvent lifecycleEvent ) {
156152 Log .d (TAG , "Emit lifecycle event: " + lifecycleEvent .getType ().name ());
157- for (Subscriber <? super LifecycleEvent > subscriber : mLifecycleSubscribers ) {
153+ for (FlowableEmitter <? super LifecycleEvent > subscriber : mLifecycleEmitters ) {
158154 subscriber .onNext (lifecycleEvent );
159155 }
160156 }
161157
162158 private void emitMessage (String stompMessage ) {
163159 Log .d (TAG , "Emit STOMP message: " + stompMessage );
164- for (Subscriber <? super String > subscriber : mMessagesSubscribers ) {
160+ for (FlowableEmitter <? super String > subscriber : mMessagesEmitters ) {
165161 subscriber .onNext (stompMessage );
166162 }
167163 }
0 commit comments