【问题标题】:How to connect via WebSocket on Android using Scarlet?如何使用 Scarlet 在 Android 上通过 WebSocket 进行连接?
【发布时间】:2019-11-12 19:36:32
【问题描述】:

README.md 中的代码

 val scarletInstance = Scarlet.Builder()
    .webSocketFactory(okHttpClient.newWebSocketFactory(GDAX_URL))
    .addMessageAdapterFactory(MoshiMessageAdapter.Factory())
    .addStreamAdapterFactory(RxJava2StreamAdapterFactory())
    .build() 

版本和依赖:

implementation 'com.tinder.scarlet:scarlet:0.1.8'
implementation "com.github.tinder.scarlet:scarlet-websocket-okhttp:0.1.7"
implementation "com.github.tinder.scarlet:scarlet-stream-adapter-rxjava2:0.2.4"
implementation "com.github.tinder.scarlet:scarlet-message-adapter-moshi:0.2.4"
implementation "com.github.tinder.scarlet:scarlet-lifecycle-android:0.2.4"

【问题讨论】:

    标签: android sockets kotlin websocket client


    【解决方案1】:

    由于类重复,您的代码失败。它是由于不同的lib版本而发生的。正确的实现是:

    //web sockets
    implementation 'com.tinder.scarlet:scarlet:0.1.10'
    implementation "com.tinder.scarlet:websocket-okhttp:0.1.10"
    implementation "com.tinder.scarlet:stream-adapter-rxjava2:0.1.10"
    implementation "com.tinder.scarlet:message-adapter-moshi:0.1.10"
    implementation "com.tinder.scarlet:lifecycle-android:0.1.10"
    

    【讨论】:

      【解决方案2】:

      首先,您应该使用接口声明一个 WebSocket 客户端。使用 Scarlet 注释,例如 @Receive@Send 来定义您将如何处理 WebSocket 通信,如下例所示:

      interface NewsService {
          @Receive
          fun observeWebSocketEvent(): Flowable<WebSocket.Event>
          @Send
          fun sendSubscribe(subscribe: Subscribe)
          @Receive
          fun observeNews(): Flowable<MyNews>
      }  
      

      下一步是创建 Scarlet 接口的实现并订阅在 WebSocket 连接期间发出的数据流。在以下示例中,使用了 Moshi 和 RxJava,但 Scarlet 提供了其他方式来处理和操作数据。

      val scarletInstance = Scarlet.Builder()
          .webSocketFactory(okHttpClient.newWebSocketFactory(BASE_URL))
          .addMessageAdapterFactory(MoshiMessageAdapter.Factory())
          .addStreamAdapterFactory(RxJava2StreamAdapter.Factory())
          .build()
      
      //service created
      val newsService = scarletInstance.create<NewsService>()
      
      //define websocket event observer
      newsService.observeWebSocketEvent()
          .filter { it is WebSocket.Event.OnConnectionOpened<*> }
          .subscribe({
              newsService.sendSubscribe()
          })
      
      // news data result
      newsService.observeNews()
          .subscribe({ news ->
              Log.d(TAG, news.toString())
          })
      

      【讨论】:

      • 您好,感谢您的回答,如何关闭连接。
      • 为了关闭连接创建一个生命周期,例如var myLifecycle = CustomSocketLifecycle() 其中class CustomSocketLifecycle( val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry() ) : Lifecycle by lifecycleRegistry { init { lifecycleRegistry.onNext(Lifecycle.State.Started) } } 用于开始收听使用myLifecycle.lifecycleRegistry.onNext(Lifecycle.State.Started) 并停止收听使用myLifecycle.lifecycleRegistry.onNext(Lifecycle.State.Stopped.WithReason(ShutdownReason.GRACEFUL))
      • 如何在没有 RxJava 但使用实时数据的情况下做到这一点
      • 您应该为此考虑 Kotlin.Flow
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2018-02-19
      • 1970-01-01
      • 2016-04-26
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多