Android 调度程序通信不工作时的运行阻塞
我已将我的上下文切换到Dispatcher.Main以显示UI,但在runBlocking上获取的数据无法在RecylerView中显示 我做错了什么?从一个调度器向另一个调度器返回数据的适当方式是什么 我试过另一种方法Android 调度程序通信不工作时的运行阻塞,android,kotlin,dispatcher,kotlin-coroutines,Android,Kotlin,Dispatcher,Kotlin Coroutines,我已将我的上下文切换到Dispatcher.Main以显示UI,但在runBlocking上获取的数据无法在RecylerView中显示 我做错了什么?从一个调度器向另一个调度器返回数据的适当方式是什么 我试过另一种方法 GlobalScope.launch { withContext(Dispatchers.IO){ var fruits = arrayOf("Grapes","Apple","Mango","TuttiFruit","P
GlobalScope.launch {
withContext(Dispatchers.IO){
var fruits = arrayOf("Grapes","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple").toList()
return@withContext
}
recyclerView.adapter = FruitAdapter(fruits)
}
但是在上面的方法中,我必须将水果声明为全局的,而我不想让它全局地工作。有没有一种方法可以将数据从一个调度程序队列返回到另一个调度程序队列
我必须从Api(IO操作)获取数据,并在RecyclerView(主线程操作)中显示该数据
这是因为在获取数据后必须切换上下文:
GlobalScope.launch(Dispatchers.IO){
var fruits = arrayOf("Grapes","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple").toList()
withContext(Dispatchers.MAIN){
recyclerView.adapter = FruitAdapter(fruits)
}
}
根据评论进行编辑:
有关运行阻塞
的信息,请查看文档第一段
运行新的协程并中断当前线程,直到
它的完成。此函数不应从协同程序中使用。信息技术
设计用于将常规阻塞代码桥接到
以挂起方式编写,用于主要功能和
测试
其次,您要求使用GlobalScope
。是的,如果你在安卓系统中进行协同程序,你应该避免这样做
如何在Android Activity/Fragment中启动协同程序
首先,我建议在ViewModel
或Presenter
中使用,但如果您想在活动/片段中启动协同程序,则需要一种控制和管理其取消的方法,以避免内存泄漏。
解决办法是:
private val job: Job = Job()
//or Dispatchers.IO
private val fragmentScope = CoroutineScope(Dispatchers.MAIN + job)
//launch a coroutine later in Activity/Fragment
fragmentScope.launch{
//the default coroutine dispatcher would be the defined dispatcher above
}
override fun onDestroy(){
super.onDestroy()
fragmentScope.cancel()
}
关于你的问题:
我做错了什么?返回数据的适当方式是什么
从一个调度员到另一个调度员
如果要从其他上下文返回值,也可以尝试此解决方案:
someScope.launch(Dispatchers.MAIN){
var data = withContext(Dispatchers.IO){
val someData = fetchSomeData()
return@withContext data
}
if(data.isAvailable()){ //for example
//runing on the main thread
}
}
这是因为在获取数据后必须切换上下文:
GlobalScope.launch(Dispatchers.IO){
var fruits = arrayOf("Grapes","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple",
"Pomegrante","Apple","Mango","TuttiFruit","PineApple").toList()
withContext(Dispatchers.MAIN){
recyclerView.adapter = FruitAdapter(fruits)
}
}
根据评论进行编辑:
有关运行阻塞
的信息,请查看文档第一段
运行新的协程并中断当前线程,直到
它的完成。此函数不应从协同程序中使用。信息技术
设计用于将常规阻塞代码桥接到
以挂起方式编写,用于主要功能和
测试
其次,您要求使用GlobalScope
。是的,如果你在安卓系统中进行协同程序,你应该避免这样做
如何在Android Activity/Fragment中启动协同程序
首先,我建议在ViewModel
或Presenter
中使用,但如果您想在活动/片段中启动协同程序,则需要一种控制和管理其取消的方法,以避免内存泄漏。
解决办法是:
private val job: Job = Job()
//or Dispatchers.IO
private val fragmentScope = CoroutineScope(Dispatchers.MAIN + job)
//launch a coroutine later in Activity/Fragment
fragmentScope.launch{
//the default coroutine dispatcher would be the defined dispatcher above
}
override fun onDestroy(){
super.onDestroy()
fragmentScope.cancel()
}
关于你的问题:
我做错了什么?返回数据的适当方式是什么
从一个调度员到另一个调度员
如果要从其他上下文返回值,也可以尝试此解决方案:
someScope.launch(Dispatchers.MAIN){
var data = withContext(Dispatchers.IO){
val someData = fetchSomeData()
return@withContext data
}
if(data.isAvailable()){ //for example
//runing on the main thread
}
}
我知道我不应该使用环球镜。那么我还应该使用什么范围呢。我尝试使用launch direct,但活动中缺少它。为什么?我感谢您的努力。最后一点,为什么我们要在一个CoroutineScope(Dispatchers.Main+SupervisorJob())中添加两个值,例如Main和job??很抱歉:首先是
+
而不是=
。但是,第二,作业是控制操作(访问和管理操作)所需的方式,而协程作用域只是告诉我们的协程上下文有一个作业并且它正在一些Dispatchers.MAIN中运行的一种方式。这只是一个Kotlin的东西,+
,我知道我不应该使用GlobalScope。那么我还应该使用什么范围呢。我尝试使用launch direct,但活动中缺少它。为什么?我感谢您的努力。最后一点,为什么我们要在一个CoroutineScope(Dispatchers.Main+SupervisorJob())中添加两个值,例如Main和job??很抱歉:首先是+
而不是=
。但是,第二,作业是控制操作(访问和管理操作)所需的方式,而协程作用域只是告诉我们的协程上下文有一个作业并且它正在一些Dispatchers.MAIN中运行的一种方式。这只是一个Kotlin的东西,+