【问题标题】:ProgressBar wont be visible in Android Studio from codeProgressBar 从代码中不会在 Android Studio 中可见
【发布时间】:2020-02-16 10:58:24
【问题描述】:

所以我做了一个应用程序,我试图在单击按钮时显示进度条。

仅当我将 View.VISIBLE 放在处理程序之外时才会显示。

Kotlin 代码:

button.setOnClickListener {

progressBar.visibility = View.VISIBLE
    runBlocking {

        try {
            //HTTP request removed because of confidentiality, assume I'm setting delay

        } catch (e: Exception) {
            Log.e(tag, "Error: " + e.message)
            Toast.makeText(this@MainActivity, "Could not find page", Toast.LENGTH_LONG)
                .show()
        }

    }
    progressBar.visibility = View.GONE
}

按钮 XML:

<ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:alpha="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility= "invisible"/>

我已经搜索了几个小时,但找不到与我的案例相关的内容。

想要的输出: 获取点击按钮时的进度条。

【问题讨论】:

  • 你在哪里运行 runBlocking()?是 IO 调度器还是 UI 线程?

标签: android kotlin coroutine


【解决方案1】:

执行progressBar.visibility = View.VISIBLE 之类的命令可能需要几纳秒(大约 144100)。

主线程可能会要求其他线程执行某些任务,而不是等待这些线程的响应,它会恢复其正常执行(下一行代码)。您的下一行代码(runBlocking:运行一个新的协程并阻塞当前线程中断直到它完成。)阻塞当前线程,直到从 runBlocking 方法启动的协程完成.这只是意味着在协程完成之前,主线程无法执行其他命令或处理从其他线程接收到的响应。

一旦协程完成。主线程恢复执行,同时显示和隐藏进度条,这就是您看不到进度条旋转的原因。

主线程应该只用于 UI 操作。与其阻塞主线程,不如通过切换到 IO 上下文在协程中执行网络操作。

在此处查看调度程序的类型。 https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb

bt.setOnClickListener {
    progressBar.visibility = View.VISIBLE
    GlobalScope.launch {
        networkCall()
    }

}

private suspend fun networkCall() {
    withContext(Dispatchers.Default) {
        for (i in 1..50000) {
            Log.v("Network call", "$i")
        }
        runOnUiThread {
            progressBar.visibility = View.INVISIBLE
        }
    }
}

【讨论】:

  • 这可行,但我不断收到此错误:E/MainActivity:错误:只有创建视图层次结构的原始线程才能触摸其视图。应用崩溃
  • 您的应用程序正在崩溃,因为您正在后台线程上执行与 UI 相关的操作。您的 UI 操作只能在主线程中完成。使用 runOnUiThread 方法或处理程序在主线程上执行 UI 相关操作。您还可以使用 withContext(Dispatchers.Main) 或 launch(Dispatchers.Main) 来执行 UI 相关操作。
【解决方案2】:

从代码中删除该行:

progressBar.visibility = View.GONE

【讨论】:

    【解决方案3】:

    因为您的样式是 (style="?android:attr/progressBarStyle"),而您的宽度/高度是 (wrap_content)。对于酒吧风格。你应该给它一个值(例如 100dp 到 WIDTH,20dp 到 HEIGHT。

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2017-08-04
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多