Android如何更新ProgressBar的值?

前端之家收集整理的这篇文章主要介绍了Android如何更新ProgressBar的值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的活动有一个ProgressBar.当开始活动时,我会检查从另一个地方获取的值并更新到ProgressBar.这是我的代码
  1. final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar_detail);
  2. final TextView progressText = (TextView) findViewById(R.id.progressText_detail);
  3. final ImageView btnCancel = (ImageView) findViewById(R.id.imgCancel_detail);
  4. progressBar.setVisibility(View.VISIBLE);
  5. progressText.setVisibility(View.VISIBLE);
  6. btnCancel.setVisibility(View.VISIBLE);
  7. Thread t = new Thread() {
  8. public void run() {
  9. ((Activity) ctx).runOnUiThread(new Runnable() {
  10. public void run() {
  11. int oldProgress = 0;
  12. while (progressBar.getProgress() < 100) {
  13. int value = Downloader.progress.get(gameId+ "");
  14. if (value != oldProgress) {
  15. oldProgress = value;
  16. progressBar.setProgress(value);
  17. progressText.setText(value + " %");
  18. }
  19. }
  20. }
  21. });
  22. }
  23. };
  24. t.start();

ProgressBar的值来自int value = Downloader.progress.get(gameId)并且它是正确的.但是,当我运行此代码时,活动没有响应,也没有显示任何内容(但应用程序没有崩溃).看起来像更新ProgressBar的线程正在运行并阻止UI线程,因此活动布局没有显示.

我的代码出了什么问题?在这种情况下更新ProgressBar的正确方法是什么?

解决方法

您正在UI线程中运行一段时间(progressBar.getProgress()< 100)(您使用runOnUiThread),因此UI线程将被阻止(并且不会被绘制),直到此循环结束. 您可以:
>将runOnUiThread放入循环中,也许在de runOnUiThread调用内部进行休眠.但是,它不是首选的解决方案,因为您使用太多cpu来查找值更改.睡眠接近它有点难看但解决cpu问题.它会像::
  1. Thread t = new Thread() {
  2. public void run() {
  3. int oldProgress = 0;
  4.  
  5. while (progressBar.getProgress() < 100) {
  6. ((Activity) ctx).runOnUiThread(new Runnable() {
  7. public void run() {
  8. int value = Downloader.progress.get(gameId+ "");
  9. if (value != oldProgress) {
  10. oldProgress = value;
  11. progressBar.setProgress(value);
  12. progressText.setText(value + " %");
  13. }
  14. }
  15. }
  16. Thread.sleep(500);
  17. }
  18. });
  19. }
  20. };

>以事件方式更新进度条,以便在进度更改时仅调用(在UI线程中)更新代码.这是首选方式.

猜你在找的Android相关文章