如何使用Scarlet在Android上通过WebSocket连接?

San*_*por 5 sockets client android websocket kotlin

README.md中的代码

 val scarletInstance = Scarlet.Builder()
    .webSocketFactory(okHttpClient.newWebSocketFactory(GDAX_URL))
    .addMessageAdapterFactory(MoshiMessageAdapter.Factory())
    .addStreamAdapterFactory(RxJava2StreamAdapterFactory())
    .build() 
Run Code Online (Sandbox Code Playgroud)

版本和依赖项:

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"
Run Code Online (Sandbox Code Playgroud)

Tri*_*ity 5

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

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

下一步是创建 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())
    })
Run Code Online (Sandbox Code Playgroud)

  • 要关闭连接,请创建一个生命周期,例如 `var myLifecycle = CustomSocketLifecycle()` 其中 `class CustomSocketLifecycle( vallifecycleRegistry: LifecycleRegistry = LifecycleRegistry() ) : Lifecycle bylifecycleRegistry { init {lifecycleRegistry.onNext(Lifecycle.State.Started) } }` for开始监听使用 `myLifecycle.lifecycleRegistry.onNext(Lifecycle.State.Started)` 并停止监听使用 `myLifecycle.lifecycleRegistry.onNext(Lifecycle.State.Stopped.WithReason(ShutdownReason.GRACEFUL))` (3认同)