Как правильно работать с потоками в android?

Интересует как работать с потоками на kotlin или java в android. Как я знаю, что рисование элементов или присвоение значениям элементам в UI, нужно в главном потоке, где обрабатываются события. Раньше помню был Async вроде, там что-то было насчет того, что получаешь сетевые данные в одном потоке, а рисуешь уже в главном. Но async устарел. И вот я написал например такую функцию.

        Thread(Runnable {
            var idBitmexBalance : TextView
            var bitmexBalance : String
            kotlin.run {
                idBitmexBalance = findViewById(R.id.bitmex_balance) as TextView
                var idButtonUpdate = findViewById(R.id.button_update) as Button

                bitmexBalance = getBitmexBalance()
                idBitmexBalance.text = bitmexBalance
            }
        }).start()

Я уверен что это неправильный код. Я в основном программировал на C в GTK и там можно в отдельном потоке получить сетевые данные, а потом поставить в очередь новые значения для виджетов с помощью g_idle_add и это выполниться в главном потоке и будет правильно. Но в таких языках как java и kotlin мне сложно понять как это должно быть. Подскажите пожалуйста. преимущественно надо на kotlin, но думаю если вы знаете как это должно быть на java только, то пишите хоть на java. Функции потоков у android всё равно общие для java и kotlin.


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

Автор решения: androkettle

В activity есть метод runOnUiThread(runnable). Либо, если вне активити:

    fun runOnUiThread(runnable: Runnable) {
        val looper = Looper.getMainLooper()
        if (Thread.currentThread() === looper.thread) {
            runnable.run()
        } else {
            Handler(looper).post(runnable)
        }
    }

Использование:

    runOnUiThread {
        println("I am in the UI thread")
    }
→ Ссылка