Как исправить ошибку Can't create handler inside thread that has not called Looper.prepare() и заполнить массив на Kotlin?

У меня есть activity в котором я подключаюсь к веб-сокету. Он должен присылать сообщения с помощью которых я буду заполнять список, а уже с помощью списка заполняется recycler view

activity:

class ShowTariffsActivity : AppCompatActivity() {

    var tariffList : ArrayList<WebSocketResponse> = arrayListOf()

    var adapter: TarrifsAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_show_tariffs)

        val departureId = intent.getIntExtra("id", 0)

        val client = OkHttpClient.Builder()
            .readTimeout(3, TimeUnit.SECONDS)
            .build()
        val request = Request.Builder()
            .url("ws://68.183.30.45/ws/calculation/${departureId}/")
            .build()
        val wsListener = WebSocketList()
        val webSocket = client.newWebSocket(request, wsListener)

        rcViewTarrif.hasFixedSize()
        rcViewTarrif.layoutManager = LinearLayoutManager(this)
        adapter = TarrifsAdapter(tariffList, this)
        rcViewTarrif.adapter = adapter
    }

    private class WebSocketList: WebSocketListener() {
        override fun onMessage(webSocket: WebSocket, text: String) {
            val tarrifs = ShowTariffsActivity()
            val result = Klaxon().parse<WebSocketResponse>(text)

            if (result != null) {
                tarrifs.tariffList.add(result)
            }

        }

        override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
            webSocket.close(NORMAL_CLOSURE_STATUS, null)
        }

        override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
            Log.d("WebSocket", t.message.toString())
        }

        companion object {
            private val NORMAL_CLOSURE_STATUS = 1000
        }
    }
}

ошибка:

2020-12-18 02:49:50.486 13152-13519/? D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()
2020-12-18 18:18:51.692 13912-14078/? D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()
2020-12-18 18:23:21.269 15026-15102/? D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()
2020-12-18 18:37:00.410 15197-15268/? D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()
2020-12-18 18:38:10.729 15361-15438/? D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()
2020-12-18 18:49:23.152 16017-16088/com.example.kenguruexpress D/WebSocket: Can't create handler inside thread that has not called Looper.prepare()

Пробовал находить альтернативу и нашёл + исправил activity:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_show_tariffs)

        val departureId = intent.getIntExtra("id", 0)

        Handler(Looper.getMainLooper()).post {
            testWSS(departureId)
        }

        rcViewTarrif.hasFixedSize()
        rcViewTarrif.layoutManager = LinearLayoutManager(this)
        adapter = TarrifsAdapter(tariffList, this)
        rcViewTarrif.adapter = adapter
    }

    private fun testWSS(id: Int) {
        val ws = WebSocketFactory().createSocket("ws://68.183.30.45/ws/calculation/$id/", 5000)

        ws.addListener(object : WebSocketAdapter() {
            override fun onTextMessage(websocket: WebSocket?, text: String?) {
                super.onTextMessage(websocket, text)

                val result = Klaxon().parse<WebSocketResponse>(text!!)
                tariffList.add(result!!)
            }

            override fun onTextMessageError(websocket: WebSocket?, cause: WebSocketException?, data: ByteArray?) {
                super.onTextMessageError(websocket, cause, data)
                Log.d("WebSocket", cause?.message.toString())
            }

            override fun onCloseFrame(websocket: WebSocket?, frame: WebSocketFrame?) {
                super.onCloseFrame(websocket, frame)
                Log.v("WSS", "closing socket")
            }
        })
    }

вызов так же изменил, вроде как правильно, но всё равно список tarrifList оказывается пустым, то есть сообщений от веб сокета я не получаю, в чём может быть проблема?


Ответы (0 шт):