JDBC и Kotlin Coroutines

Сейчас понемногу осваиваю Android и не могу решить такую дилемму. У меня есть вот такой страшненький класс, который выполняет подключение к базе данных, его экземпляр создаётся в репозитории и через публичное поле st: Statement я выполняю различные запросы, они тоже похожим образом через Thread и уже во ViewModel их результаты присваиваются LiveData.

Мне бы хотелось это всё сделать через coroutines, но у меня не выходит. Получается переменным в корутине не присваиваются значения и, например, после инициализации этого класса, connection остаётся пустым, хотя в логе он как бы успешно подключается. Я так понимаю что основной поток как-бы не дожидается выполнения корутины и поэтому значения не присваиваются.

Как это можно бы реализовать? Или может совсем всё плохо и для корутин совсем другая логика работы нужна? Тогда хотел бы попросить совета куда копать. Все что нахожу о корутинах как-будто не о том, голову сломал уже.

class PostgreDatabase{

    lateinit var st: Statement
    var status = false

    private lateinit var connection: Connection

    init {
        val user = "***"
        val password = "***"
        val url = "***"
        val thread = Thread(Runnable {
            kotlin.run {
                try {
                    connection = DriverManager.getConnection(url, user, password)
                    st = connection.createStatement()
                    status = true
                    Log.d("SQL", "Connected: $status")
                } catch (e: Exception) {
                    status = false
                    Log.d("SQL", e.message.toString())
                    e.printStackTrace()
                }
            }
        })
        thread.start()
        try {
            thread.join()
        } catch (e: Exception) {
            Log.d("SQL", e.toString())
        }
    }
}

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

Автор решения: Wlad
  1. вы используете не коррутины, а классический поток как в Java.
  2. вы правильно говорите

основной поток как-бы не дожидается выполнения корутины и поэтому значения не присваиваются.

чтобы забирать данные из потоков/коррутин вам надо копать в сторону реактивного программирования.
у вас есть следующие варианты:

  1. RxJava 1-2 - тяжелая и сложная библиотека. к тому же, я считаю, старая. хотя и множество проектов написано на ней.
  2. Coroutine + LiveData - современный и простой подход к реактивному программированию.
  3. Flow + LIveData - ооочень современно и между коррутинами и ЛайвДатой. Flow отлично показывает себя с БД Room.
  4. RxKotlin - не знаю никого, ктобы его использовал))

сугубо мое личное мнение:
освойте сначала LiveData - на вашем коде.
потом изучите Коррутины, замените Thred на них.
освойте Flow.
если это все освоите и когда-нибудь столкнетесь с RxJava - вам будет проще его понять, чем с нуля.

→ Ссылка