【问题标题】:Kotlin coroutines: why can't I see logs until the end?Kotlin 协程:为什么我直到最后都看不到日志?
【发布时间】:2019-06-19 13:03:07
【问题描述】:

我是 kotlin 协程的新手,有一些疑问。因此,我尝试使用 kotlin 协程下载字体列表,并添加了一些日志以查看何时下载字体,或者在字体已存在时显示消息。我希望每次访问字体时都会看到一个日志,但是我只看到进度条,当它被隐藏时,我会立即看到所有日志。我做错了吗?

private fun init() {
    val job = Job()
    val bgScope = CoroutineScope(Dispatchers.IO + job)

    bgScope.launch {
        getStuff()
    }
}

fun getStuff() {
    val uiScope = CoroutineScope(Dispatchers.Main + Job())
    uiScope.launch {
        progressbar.visibility = View.VISIBLE
    }

    for (font in jsonObject.fontList) {
        if (!font.exists()) {
            downloadFile(font)
            Timber.d("file " + font.id + " downloaded: " + font.exists())
        } else {
            Timber.d("file " + font.id + " already exists ")
        }

    }

    uiScope.launch {
        progressbar.visibility = View.GONE
    }

【问题讨论】:

  • 不确定这是否与您的问题有关,但launch 启动了一个可能与下载并行运行的作业。您可能想改用withContext,这样您就可以确保在开始下载时进度条是可见的。

标签: android kotlin kotlin-coroutines


【解决方案1】:

那是因为你的

for (font in jsonObject.fontList) {
        if (!font.exists()) {
            downloadFile(font)
            Timber.d("file " + font.id + " downloaded: " + font.exists())
        } else {
            Timber.d("file " + font.id + " already exists ")
        }

    }

在另一个线程中运行,并延迟响应。因此,您应该在 downloadFile 完成后修改您的进度可见性。

您应该在downloadFileMethod() 中启动协程,同时打开/关闭进度条。

【讨论】:

  • 但是我希望progressBar在整个for循环中都可见,我不应该将它设置为在循环之后而不是在downloadFile函数中吗?在这种情况下,第一个字体下载后它就会消失,不是吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多