Предпосылки: я уже прочитал и попробовал все решения, предложенные в других сообщениях, где у других пользователей было такое же исключение
У меня есть ветка, которую я запускаю внутри своего приложения onCreate
open class App : Application() {
override fun onCreate() {
Thread {
...
}.start()
}
}
в какой-то момент, всегда внутри потока, у меня есть класс, который хочет реализовать наблюдаемую переменную, используя 'by Delegates.observable'
class MyService{
var myVariable: String by Delegates.observable("default value") { _, oldValue, newValue ->
onVariableChanged?.invoke(oldValue, newValue)
}
var onVariableChanged: ((String, String) -> Unit)? = null
fun doSomething(){
myVariable = "result"
// ---- I also tried the 2 solutions commented below ----
//
// val handler = Handler(getMainLooper())
// handler.post {myVariable = "result"}
// GlobalScope.launch {
// withContext(Dispatchers.Main){
// myVariable = "result"
// }
// }
}
}
Теперь мне нужно это в ViewModel я мог наблюдать переменную, которая должна обновляться в потоке
class MyViewModel(application: Application) : AndroidViewModel(application) {
// ---- I also tried with couroutines --------
// private val viewModelJob = SupervisorJob()
// private val viewModelScope = CoroutineScope(viewModelJob + Dispatchers.Main)
init {
// viewModelScope.launch {
// onVariableThreadChanged()
// }
onVariableThreadChanged()
}
private fun onVariableThreadChanged(){
myServiceInstance.onVariableChanged = {oldValue , newValue ->
.....
}
}
}
При чтении файла журнала я вижу, что в методе потока, где я пытаюсь присвоить значение
myVariable = "result"
переменной 'by Delegates.observable' дает мне исключение
«Только исходный поток, создавший иерархию представлений, может касаться его представлений».