三分钟教你用 Scarlet 写一个 WebSocket App
作者 | Eason
來源 |?程序員巴士
在移動應用程序中,數據層是屏幕上顯示內容的真實來源。然而,在今年早些時候在 Tinder 中集成了 WebSocket API 時,維護它成為了一個令人頭疼的問題。為了在 Android 上更輕松地集成 WebSocket,Scarlet應運而生。
WebSocket 是在 Android 應用程序中實現數據層的選項之一,尤其是在應用需要實時更新數據的情況下,例如聊天、在線多人游戲和實時提要。它在客戶端和服務器之間建立雙向連接。當連接打開時,它們可以以低開銷來回發送文本和二進制消息。本文將教大家如何在Android應用中快速實現WebSocket。
設置
要實現 Scarlet,首先將其添加到 app/build.gradle 文件。
dependencies?{...//?scarletimplementation?'com.tinder.scarlet:scarlet:0.1.12'}在 Scarlet 提供的示例中,RxJava 用于幫助管理 Web 套接字發送的數據流。在 app/build.gradle 中實現它。
dependencies?{//?rximplementation?'io.reactivex.rxjava2:rxjava:2.2.21'implementation?'io.reactivex.rxjava2:rxandroid:2.1.1'implementation?'io.reactivex.rxjava2:rxkotlin:2.4.0' }如果大家對 Coroutine 和 Kotlin Flow 的支持感到好奇,請參閱此處:https : //github.com/Tinder/Scarlet/issues/114
現在我們設置的重要部分是服務。我們可以使用websocket-echo (wss://websocket-echo.glitch.me)測試我們的 WebSocket;
創建接口函數
接下來,創建一個interface以定義與 WebSocket 通信的函數。
interface?EchoService?{@Receivefun?observeConnection():?Flowable<WebSocket.Event>@Sendfun?sendMessage(param:?String) }如上所示,服務接口看起來與改造非常相似。大家可以使用@Receive注解來觀察來自 WebSocket 的數據流,并用于@Send向WebSocket發送或訂閱數據。
設置好服務后,我們可以繼續在我們的活動中實現服務;在這種情況下,我沒有使用任何架構,只是在Activity中實現了服務。
class?MainActivity?:?AppCompatActivity()?{...private?fun?setupWebSocketService()?{webSocketService?=?provideWebSocketService(scarlet?=?provideScarlet(client?=?provideOkhttp(),lifecycle?=?provideLifeCycle(),streamAdapterFactory?=?provideStreamAdapterFactory(),))}private?fun?provideWebSocketService(scarlet:?Scarlet)?=?scarlet.create(EchoService::class.java)private?fun?provideScarlet(client:?OkHttpClient,lifecycle:?Lifecycle,streamAdapterFactory:?StreamAdapter.Factory,)?=Scarlet.Builder().webSocketFactory(client.newWebSocketFactory(ECHO_URL)).lifecycle(lifecycle).addStreamAdapterFactory(streamAdapterFactory).build()private?fun?provideOkhttp()?=OkHttpClient.Builder().addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)).build()private?fun?provideLifeCycle()?=?AndroidLifecycle.ofApplicationForeground(application)private?fun?provideStreamAdapterFactory()?=?RxJava2StreamAdapterFactory()... }測試
現在我們可以通過向 WebSocket 發送一些東西來測試下代碼。WebSocket 將在它們檢索時發送相同的消息。
class?MainActivity?:?AppCompatActivity()?{...private?fun?sendMessage(message:?String)?{webSocketService.sendMessage(message)adapter.addItem(Message(message?=?message,?isFromSender?=?true))}@SuppressLint("CheckResult")private?fun?observeConnection()?{webSocketService.observeConnection().observeOn(AndroidSchedulers.mainThread()).subscribe({?response?->Log.d("observeConnection",?response.toString())onReceiveResponseConnection(response)},?{?error?->Log.e("observeConnection",?error.message.orEmpty())Snackbar.make(binding.root,?error.message.orEmpty(),?Snackbar.LENGTH_SHORT).show()})}private?fun?onReceiveResponseConnection(response:?WebSocket.Event)?{when?(response)?{is?OnConnectionOpened<*>?->?changeToolbarTitle("connection?opened")is?OnConnectionClosed?->?changeToolbarTitle("connection?closed")is?OnConnectionClosing?->?changeToolbarTitle("closing?connection..")is?OnConnectionFailed?->?changeToolbarTitle("connection?failed")is?OnMessageReceived?->?handleOnMessageReceived(response.message)}}private?fun?handleOnMessageReceived(message:?MessageScarlet)?{adapter.addItem(Message(message.toValue(),?false))binding.etMessage.setText("")}private?fun?MessageScarlet.toValue():?String?{return?when?(this)?{is?Text?->?valueis?Bytes?->?value.toString()}}... }總結
這就是本文討論的全部內容。Scarlet 是一個很棒的庫,可讓大家訪問在 Android 應用程序中實現 WebSocket。大家可以通過以上教程輕松為自己的應用設置 Scarlet ,特別是如果已經熟悉 Retrofit 等工具。
往期推薦
為什么還有這么多的網絡故障?
k8s集群居然可以圖形化安裝了?
用了HTTPS,沒想到還是被監控了
快速搭建實驗環境:使用 Terraform 部署 Proxmox 虛擬機
點分享
點收藏
點點贊
點在看
總結
以上是生活随笔為你收集整理的三分钟教你用 Scarlet 写一个 WebSocket App的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 到底是无线最难?还是核心网最难?
- 下一篇: 加速引擎SmartFlow助力浪潮云海超