首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delegates.observable的Android从后台线程到ViewModel

Delegates.observable的Android从后台线程到ViewModel
EN

Stack Overflow用户
提问于 2020-06-18 09:39:26
回答 1查看 796关注 0票数 1

前提:我已经阅读并试用了其他帖子中提出的所有解决方案,其中其他用户也有相同的例外

我在我的应用程序的onCreate中启动了一条线程

代码语言:javascript
复制
open class App : Application() {

   override fun onCreate() {

      Thread {
           ...
             }.start()
   }
}

在某个时候,总是在线程中,我有一个类希望使用'by Delegates.observable‘实现一个可观察的变量

代码语言:javascript
复制
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中能够观察到应该在线程中更新的变量

代码语言:javascript
复制
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 ->
              .....
           }
   }

}

在读取日志文件时,我看到在线程方法中,我试图分配值。

代码语言:javascript
复制
myVariable = "result"

的变量'by Delegates.observable‘给了我一个例外

“只有创建视图层次结构的原始线程才能触摸其视图。”

EN

回答 1

Stack Overflow用户

发布于 2020-06-22 07:37:33

我通过将委托放入couroutineScope (Dispatchers.Main) .launch {.}并将活动中的viewModel代码移动到runOnUiThread {..}方法来解决问题。

进入MyService

代码语言:javascript
复制
  CoroutineScope(Dispatchers.Main).launch {
                            myVariable = "result"
                        }

进入MyActivity

代码语言:javascript
复制
  runOnUiThread(
            myServiceInstance.onVariableChanged = {oldValue , newValue  ->
              .....
             }
         )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62446987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档