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 шт):
- вы используете не коррутины, а классический поток как в Java.
- вы правильно говорите
основной поток как-бы не дожидается выполнения корутины и поэтому значения не присваиваются.
чтобы забирать данные из потоков/коррутин вам надо копать в сторону реактивного программирования.
у вас есть следующие варианты:
- RxJava 1-2 - тяжелая и сложная библиотека. к тому же, я считаю, старая. хотя и множество проектов написано на ней.
- Coroutine + LiveData - современный и простой подход к реактивному программированию.
- Flow + LIveData - ооочень современно и между коррутинами и ЛайвДатой. Flow отлично показывает себя с БД Room.
- RxKotlin - не знаю никого, ктобы его использовал))
сугубо мое личное мнение:
освойте сначала LiveData - на вашем коде.
потом изучите Коррутины, замените Thred на них.
освойте Flow.
если это все освоите и когда-нибудь столкнетесь с RxJava - вам будет проще его понять, чем с нуля.