3

三分钟教你用 Scarlet 写一个 WebSocket App

 2 years ago
source link: https://mobile.51cto.com/android-698183.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

三分钟教你用 Scarlet 写一个 WebSocket App

在移动应用程序中,数据层是屏幕上显示内容的真实来源。然而,在今年早些时候在 Tinder 中集成了 WebSocket API 时,维护它成为了一个令人头疼的问题。

作者: Eason 来源:程序员巴士|2022-01-06 18:20

在移动应用程序中,数据层是屏幕上显示内容的真实来源。然而,在今年早些时候在 Tinder 中集成了 WebSocket API 时,维护它成为了一个令人头疼的问题。为了在 Android 上更轻松地集成 WebSocket,Scarlet应运而生。

WebSocket 是在 Android 应用程序中实现数据层的选项之一,尤其是在应用需要实时更新数据的情况下,例如聊天、在线多人游戏和实时提要。它在客户端和服务器之间建立双向连接。当连接打开时,它们可以以低开销来回发送文本和二进制消息。本文将教大家如何在Android应用中快速实现WebSocket。

要实现 Scarlet,首先将其添加到 app/build.gradle 文件。

  1. dependencies { 
  2.     // scarlet 
  3.     implementation 'com.tinder.scarlet:scarlet:0.1.12' 

在 Scarlet 提供的示例中,RxJava 用于帮助管理 Web 套接字发送的数据流。在 app/build.gradle 中实现它。

  1. dependencies { 
  2.      implementation 'io.reactivex.rxjava2:rxjava:2.2.21' 
  3.      implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' 
  4.      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 通信的函数。

  1. interface EchoService { 
  2.     @Receive 
  3.     fun observeConnection(): Flowable<WebSocket.Event> 
  4.     @Send 
  5.     fun sendMessage(param: String) 

如上所示,服务接口看起来与改造非常相似。大家可以使用@Receive注解来观察来自 WebSocket 的数据流,并用于@Send向WebSocket发送或订阅数据。

设置好服务后,我们可以继续在我们的活动中实现服务;在这种情况下,我没有使用任何架构,只是在Activity中实现了服务。

  1. class MainActivity : AppCompatActivity() { 
  2.     private fun setupWebSocketService() { 
  3.         webSocketService = provideWebSocketService( 
  4.             scarlet = provideScarlet( 
  5.                 client = provideOkhttp(), 
  6.                 lifecycle = provideLifeCycle(), 
  7.                 streamAdapterFactory = provideStreamAdapterFactory(), 
  8.     private fun provideWebSocketService(scarlet: Scarlet) = scarlet.create(EchoService::class.java) 
  9.     private fun provideScarlet( 
  10.         client: OkHttpClient, 
  11.         lifecycle: Lifecycle, 
  12.         streamAdapterFactory: StreamAdapter.Factory, 
  13.         Scarlet.Builder() 
  14.             .webSocketFactory(client.newWebSocketFactory(ECHO_URL)) 
  15.             .lifecycle(lifecycle) 
  16.             .addStreamAdapterFactory(streamAdapterFactory) 
  17.             .build() 
  18.     private fun provideOkhttp() = 
  19.         OkHttpClient.Builder() 
  20.             .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)) 
  21.             .build() 
  22.     private fun provideLifeCycle() = AndroidLifecycle.ofApplicationForeground(application) 
  23.     private fun provideStreamAdapterFactory() = RxJava2StreamAdapterFactory() 

现在我们可以通过向 WebSocket 发送一些东西来测试下代码。WebSocket 将在它们检索时发送相同的消息。

  1. class MainActivity : AppCompatActivity() { 
  2.     private fun sendMessage(message: String) { 
  3.         webSocketService.sendMessage(message) 
  4.         adapter.addItem(Message(message = message, isFromSender = true)) 
  5.     @SuppressLint("CheckResult") 
  6.     private fun observeConnection() { 
  7.         webSocketService.observeConnection() 
  8.             .observeOn(AndroidSchedulers.mainThread()) 
  9.             .subscribe({ response -> 
  10.                 Log.d("observeConnection", response.toString()) 
  11.                 onReceiveResponseConnection(response) 
  12.             }, { error -> 
  13.                 Log.e("observeConnection", error.message.orEmpty()) 
  14.                 Snackbar.make(binding.root, error.message.orEmpty(), Snackbar.LENGTH_SHORT).show() 
  15.     private fun onReceiveResponseConnection(response: WebSocket.Event) { 
  16.         when (response) { 
  17.             is OnConnectionOpened<*> -> changeToolbarTitle("connection opened") 
  18.             is OnConnectionClosed -> changeToolbarTitle("connection closed") 
  19.             is OnConnectionClosing -> changeToolbarTitle("closing connection..") 
  20.             is OnConnectionFailed -> changeToolbarTitle("connection failed") 
  21.             is OnMessageReceived -> handleOnMessageReceived(response.message) 
  22.     private fun handleOnMessageReceived(message: MessageScarlet) { 
  23.         adapter.addItem(Message(message.toValue(), false)) 
  24.         binding.etMessage.setText("") 
  25.     private fun MessageScarlet.toValue(): String { 
  26.         return when (this) { 
  27.             is Text -> value 
  28.             is Bytes -> value.toString() 

这就是本文讨论的全部内容。Scarlet 是一个很棒的库,可让大家访问在 Android 应用程序中实现 WebSocket。大家可以通过以上教程轻松为自己的应用设置 Scarlet ,特别是如果已经熟悉 Retrofit 等工具。

【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK