首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用协同线之外的协同值

如何使用协同线之外的协同值
EN

Stack Overflow用户
提问于 2020-07-09 01:48:00
回答 2查看 1.2K关注 0票数 1

如何使用从coroutine外部的房间数据库发出的响应?

我需要使用coroutines来执行来自房间数据库的请求,然后将这些数据显示在回收视图中。我遇到的问题是,我无法从数据库中得到响应,无法在协同线之外显示。

我的密码。

代码语言:javascript
复制
class seconddisplay : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.second_display)

    GlobalScope.launch {
        val respo = second_Database.getInstance(context = this@seconddisplay).DAO().seeAllcodes()

    }

    second_recyclerview.apply {
        layoutManager = LinearLayoutManager(this@seconddisplay)
        adapter = displayAdapter(respo)
    }
}

我也不能将回收视图代码放在coroutine中,因为它说您不能触摸视图的层次结构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-09 06:13:48

ActivityFragment中,您可以使用lifecycleScope启动coroutine,默认情况下它运行在Main coroutine上下文中,因此您可以从那里更新UI:

代码语言:javascript
复制
lifecycleScope.launch {
    // call like this if `seeAllcodes()` method is suspend
    val respo = second_Database.getInstance(context = this@seconddisplay).DAO().seeAllcodes() 

    // call like this if `seeAllcodes()` method isn't suspend
    val respo = withContext(Dispatchers.IO) { // runs on background thread
        second_Database.getInstance(context = this@seconddisplay).DAO().seeAllcodes()
    }

    // update UI
    second_recyclerview.apply {
        layoutManager = LinearLayoutManager(this@seconddisplay)
        if (respo != null) {
            adapter = displayAdapter(respo)
        }
    }
}

要使用lifecycleScope,请将下一行添加到应用程序的build.gradle文件的依赖项中:

代码语言:javascript
复制
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-alpha05"
票数 2
EN

Stack Overflow用户

发布于 2020-07-09 02:37:21

您可以使用respo变量作为class.And的全局变量,然后使用属性withContext(Dispatcher.main)来使用主线程,然后像这样等待result.Something:

代码语言:javascript
复制
private var respo: YourDataType? = null


override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.second_display)
   getRespo()
   
}

private fun getRespo(){
   val supervisorJob = SupervisorJob()
   val coroutineScope = CoroutineScope(Dispatchers.IO + supervisorJob)
   coroutineScope.launch {
      withContext(Dispatchers.Main) {
      respo = second_Database.getInstance(this@seconddisplay).DAO().seeAllcodes()
      second_recyclerview.apply {
      layoutManager = LinearLayoutManager(this@seconddisplay)
        if(respo!=null){
          adapter = displayAdapter(respo)
        }else{//handle respo being null, maybe show a message 
          }
        }
     
      }
   }
   
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62806152

复制
相关文章

相似问题

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