如何立即开始执行 Kotlin 协程

4

我希望能立即启动一个协程。我有一段代码:

class SampleActivity : AppCompatActivity(), CoroutineScope {

    private var job: Job = Job()
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Log.d("SampleActivity", "Before launch")

        launch {
            Log.d("SampleActivity", "Inside coroutine")
        }

        Log.d("SampleActivity", "After launch")
    }
}

输出结果如下:
Before launch
After launch
Inside coroutine

有可能按照以下顺序输出吗?
Before launch
Inside coroutine
After launch

2
为什么您想立即启动协程? - Choim
@Choim 当用户在我的应用程序中打开它时,屏幕会闪烁,因为正在加载来自数据库的数据。我猜立即启动一个协程就可以解决这个问题。 - Sergio
@Sergey 屏幕闪烁不能是由于没有立即执行协程引起的。我认为你做错了什么。 - Choim
你应该使用实时数据,并设置UI在数据准备好时更新。这样,即使出现问题或设备变慢,应用程序也会看起来很流畅。 - Mihai
谢谢@SantanuSur,但是我的客户很挑剔,他不喜欢短时间的“进度条”和“进度对话框”。 - Sergio
显示剩余12条评论
1个回答

3

尝试使用以下方式启动它:

launch(Dispatchers.Main.immediate)

更多信息请参见文章。


2
还有launch(start = UNDISPATCHED),你不必重新声明你正在使用的调度程序。这是“旧方法”,也被标记为实验性的。这个特性还没有最终形式。然而,考虑到您在问题下的评论中的输入,这对解决您的问题毫无作用,因为时间差异是可以忽略的。这个改变唯一相关的影响是在第一个暂停点之前的操作的_保证顺序_(即初始连续体的执行顺序)。 - Marko Topolnik
谢谢@MarkoTopolnik,我会尝试一下,如果不起作用,我会考虑其他方法来解决我的问题。 - Sergio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接