Как действительно отключиться от WebSocket с помощью OkhttpClient?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как действительно отключиться от WebSocket с помощью OkhttpClient?

Сообщение Anonymous »

Я пытаюсь отключиться от соединения WebSocket, но его слушатель все еще жив, я вижу, что WebSockets по -прежнему воссоздают сообщения «Open/Fail» с использованием сообщений System.out.
, с одной стороны, я пытался выпустить соединение, наконец, block с использованием client.dispatcher (). executorservice (). shutdown () Метод, но он отклоняет другие будущие вызовы (так что он не работает 't Fit), с другой стороны, используя client.connectionpool (). evictall () также не помогает (даже если я подожду, потому что он может не выйти немедленно на основе документов https: //square.github. io/okhttp/4.x/okhttp/okhttp3/-ok-http-client/)
Существует код websockecketlister:

Код: Выделить всё

class WebSocketConnectionListener(
private val updateConnectionValue: (internetConnection: Boolean) -> Unit,
private val okHttpClient: OkHttpClient,
private val urlAddress: String
) : WebSocketListener() {

companion object {
private const val NORMAL_CLOSURE_STATUS = 1000
}

private var isConnected = true
private var webSocketN: WebSocket? = null

init {
createWebSocket()
}

override fun onOpen(webSocket: WebSocket, response: Response) {
println("OPEN: ${response.code}")
isConnected = true
updateConnectionValue(true)
reconnect(webSocket)
}

override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
println("FAIL: $t")
if (!isConnected) {
updateConnectionValue(false)
}
isConnected = false
reconnect(webSocket)
}

private fun createWebSocket() {
val request = Request.Builder().url(urlAddress).build()
webSocketN = okHttpClient.newWebSocket(request, this)
}

private fun reconnect(webSocket: WebSocket) {
webSocket.close(NORMAL_CLOSURE_STATUS, null)
webSocketN?.close(NORMAL_CLOSURE_STATUS, "Connection closed")
webSocketN = null

Thread.sleep(3_000)
createWebSocket()
}
}
< /code>
Существует код реализации данных: < /p>
class InternetConnectionDataSourceImpl(
private val okHttpClient: OkHttpClient,
private val urlAddress: String
) : InternetConnectionDataSource {

private fun createWebSocketListener(
internetConnectionFlow: MutableStateFlow,
) = WebSocketConnectionListener(
updateConnectionValue = { internetConnectionFlow.value = it },
okHttpClient = okHttpClient,
urlAddress = urlAddress
)

override suspend fun checkConnection(): Flow =
withContext(Dispatchers.IO) {
val internetConnectionFlow = MutableStateFlow(true)
createWebSocketListener(internetConnectionFlow)

flow {
try {
internetConnectionFlow.collect {
emit(it)
}
} finally {
println("finally")
okHttpClient.connectionPool.evictAll()
}
}
}
}
В качестве результата я получаю эти сообщения в logcat
< /p>

Подробнее здесь: https://stackoverflow.com/questions/662 ... httpclient
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»