【问题标题】:ProgressBar in Android shows only after completing some operationAndroid中的ProgressBar只有在完成一些操作后才会显示
【发布时间】:2019-02-22 19:19:51
【问题描述】:

当我执行一个短时操作时,我尝试在我的 Activity 中使用 ProgressBar。而且我意识到当我将ProgressBar可见性设置为true时,它只有在操作执行后才可见。

progressBar.setVisibility(View.VISIBLE);
calculate();
  

然后我找到了解决方案,我必须在另一个 Thread 中设置 ProgressBar 可见性。所以我的问题是:为什么我必须在另一个 Thread 中设置它?

例如,如果我让我的 ProgressBar 在创建时具有真正的可见性(在 onCreate() 中),它会继续前进并且我可以与 UI 在那一刻。我得出的结论是它们在一个线程中执行,没关系。但在我看来我错了。

【问题讨论】:

  • 尝试在另一个线程中而不是在 ui 线程上进行操作.. 可能需要很长时间才能冻结您的 ui
  • 但是无论如何,如果需要很长时间,我在执行此操作之前将ProgressBar的可见性设置为true
  • 你能放一些代码和你一起检查吗

标签: android android-progressbar android-thread


【解决方案1】:

Android UI 工具包不是线程安全的。这意味着您不能从工作线程/后台线程操作您的 UI。您必须从 UI(主)线程对用户界面进行所有操作。

Android UI 工具包包含 android.widgetandroid.view 包中的元素

经验法则:

  1. 不要阻塞 UI 线程(不要在 UI 线程中运行未指定时间的操作)
  2. 不要从 UI 线程外部访问 Android UI 工具包

这在here中有更详细的解释

使用AsyncTaskLoaders 运行后台线程始终允许您在后台线程结果分别为onPostExecute()onLoadFinished() 时更新您的UI。

因此,就您的问题而言,您必须从 UI 线程而不是其他线程更新您的 ProgressBar

【讨论】:

  • 但在我的代码中,我正在从 UI 线程更新进度条。问题是它在操作后更新,即使在代码中我先更新进度条然后做一些操作
  • 也许这个操作需要一些时间,这使得主 UI 在完成之前畅通无阻;所以它可能需要在后台线程中。 PorgressBar 的值是否取决于此操作的部分结果?
  • 哦,也许吧。不,它不依赖
猜你喜欢
  • 2018-03-30
  • 2011-07-27
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
相关资源
最近更新 更多