从okhttp WebSocketListener返回数据的正确方法是什么?

时间:2019-08-25 23:28:43

标签: android kotlin websocket okhttp okhttp3

我正在尝试使用websockets编写一个Android Chess客户端。我选择了okhttp3库。我可以建立成功的连接,并且可以发送和接收数据。但是,我不确定如何将数据返回到ViewModel的LiveData。我对Kotlin协程有点熟悉,但是我不确定如何从侦听器中获取数据。

我试图从函数中返回,但是由于它是一个被覆盖的函数,因此我无法从中返回。

这是当前的WebSocketListener:

class EchoWebSocketListener : WebSocketListener() {

    private val NORMAL_CLOSURE_STATUS = 1000

    override fun onOpen(webSocket: WebSocket, response: Response) {
        super.onOpen(webSocket, response)
        webSocket.send("Hello It is me")
        webSocket.send("test 3!")
    }

    override fun onMessage(webSocket: WebSocket, text: String){
        super.onMessage(webSocket, text)
        outputData("Receiving $text")
    }

    override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
        super.onMessage(webSocket, bytes)
        outputData("Receiving bytes : " + bytes.hex())

    }

    override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
        super.onClosing(webSocket, code, reason)
        outputData("$code $reason")
    }

    private fun outputData(outputString: String) {
        d("web socket", outputString)
    }
}

这是存储库中的设置代码

 fun startChat() {
        httpClient = OkHttpClient()
        val request = Request.Builder()
            .url("ws://echo.websocket.org")
            .build()

        val listener = EchoWebSocketListener()
        val webSocket = httpClient.newWebSocket(request, listener)
        //webSocket.
        httpClient.dispatcher.executorService.shutdown()
    }

我希望能够使用Kotlin协程运行存储库并返回LiveData以供片段使用。

1 个答案:

答案 0 :(得分:0)

在您的EchoWebSocketistener中,您可以像这样创建私有MutableLiveData

class EchoWebSocketListener : WebSocketListener() {

    private val _liveData = MutableLiveData<String>()
    val liveData: LiveData<String> get() = _liveData

    // Overridden methods

    private fun outputData(string: String) {
        _liveData.postValue(string)
    }

}

然后像在协程中一样从侦听器返回实时数据

fun startChat(): LiveData<String> {
    val listener = EchoWebSocketListener()
    GlobalScope.launch(Dispatchers.IO) {
        httpClient = OkHttpClient()
        val request = Request.Builder()
            .url("ws://echo.websocket.org")
            .build()


        val webSocket = httpClient.newWebSocket(request, listener)
        //webSocket.
        httpClient.dispatcher.executorService.shutdown()
    }
    return listener.liveData
}