`

Android 更新ProgressBar

 
阅读更多

现在我们通过一个更新ProgressBar的小案例来学习下Android的UI更新和消息机制。

如下图,点击“Start”按钮,进度条开始变化。



 第一步:如下代码:

 

btnStart.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				for (int i = 0; i <= 100; i = i + 10) {
					bar.setProgress(i);
					try {
						Thread.sleep(1000);//每隔1S更新Bar
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});

 我们发现,

 

并没有进度条递变的效果,而是start按钮一直被占用,其他的任何操作都被阻塞了,还有可能报ANR。

因为只有一个主线程,而更新进度条是个耗时操作,程序就会暂时阻塞,所有我们可以另起一个线程来处理UI更新问题。

 

		btnStart.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				new Thread() {
					public void run() {
						for (int i = 0; i <= 100; i = i + 10) {
							bar.setProgress(i);
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}}};
				}.start();
			}});

 

 

这样的改变,或许能得到我们的需求,可以更新ProgressBar,但是如果你连续点击Start按钮,则会发现,进度条的变化凌乱了。因为这个操作是并发的,而界面只有一个,多次点击Button,则会多次创建多个线程,每个线程都会对界面进行改变,这样的操作是不安全的。所以Android规定,所有的UI更新操作必须放在UI线程中进行,即主线程中去执行。那么我们该怎么做才能让主线程同步操作来更新UI。

正确的做法:

Handler + Runnable

1)创建Runnable对象,UI更新操作主要在run()方法中。

2)创建Handler对象,调用handler.post(r),把r对象加入到线程队列中,然后线程队列就开始执行run()

3)run()中调用UI更新代码,如果是循环操作,可以用handler.postDelayed(r,1000).表示隔1秒后再把线程对象r加入到线程队列中,然后再去调用run().

注意:所有操作都在一个线程中,因为没有调用Thread的start()。

 

一般来说在工作线程中执行耗时任务,当任务完成时,会返回UI线程,一般是更新UI。这时有两种方法可以达到目的。
一种是handler.sendMessage。发一个消息,再根据消息,执行相关任务代码。
另一种是handler.post(r)。r是要执行的任务代码。意思就是说r的代码实际是在UI线程执行的。可以写更新UI的代码。(工作线程是不能更新UI的)

 

具体操作请看如下代码:

  方法一:handler.post(r);

public class MainActivity2 extends Activity {

	ProgressBar bar = null;
	private Button btnStart = null;
	private Button btnEnd = null;

	Handler handler = new Handler();
	//创建Runnable对象
	Runnable r = new Runnable() {
		int i = 0;// 用来更新bar
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getId() + "-----run--->"
					+ Thread.currentThread().getName());
			i = i + 10;
			bar.setProgress(i);
			handler.postDelayed(r, 1000);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bar = (ProgressBar) findViewById(R.id.progressBar1);
		btnStart = (Button) findViewById(R.id.start);
		btnEnd = (Button) findViewById(R.id.stop);
		btnStart.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				System.out.println(Thread.currentThread().getId()
						+ "-----Main--->" + Thread.currentThread().getName());
				// 把r加入到线程队列,然后线程队列里就开始执行runnable对象中的run()
				handler.post(r);
			};
		});
		btnEnd.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				handler.removeCallbacks(r);
			}
		});
	}
}

 方法2:handler.sendMessage();

 

Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0x333:
				bar.setProgress(msg.arg1);
				postDelayed(r, 1000);
				break;
			}
		};
	};

	Runnable r = new Runnable() {
		int i = 10;
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getId() + "<>"
					+ Thread.currentThread().getName());
			Message msg = new Message();
			msg.what = 0x333;
			i = i + 10;
			msg.arg1 = i;
			handler.sendMessage(msg);
		};
	};

start.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				handler.post(r);
			}
		});

 

 


 

  • 大小: 6.8 KB
  • 大小: 20.4 KB
分享到:
评论

相关推荐

    Android 自定义各式各样的圆形ProgressBar

    在Android开发中,ProgressBar是用户界面(UI)设计中一个重要的元素,用于向用户展示某个操作的进度或者等待状态。通常,系统提供的ProgressBar样式有限,但开发者可以通过自定义来实现更多样化的效果,以满足不同...

    AndroidProgressBar_Android ProgressBar进度条的几乎全部的用法源码集.rar

    本资源"AndroidProgressBar_Android ProgressBar进度条的几乎全部的用法源码集.rar"提供了关于Android ProgressBar的多种实现方式和应用场景的源代码,非常适合开发者学习和参考。 首先,我们来详细探讨一下Android...

    Android 之 ProgressBar用法介绍

    ProgressBar是Android系统中的一种UI组件,它用于显示进度或加载状态。这个组件在各种场景下都非常常见,如数据加载、文件上传下载等。本篇文章将深入探讨ProgressBar的使用方法,包括其基本用法、样式定制以及...

    Android下ProgressBar和旗下两个子控件的使用

    在Android开发中,ProgressBar是一个非常常见的控件,用于显示进度状态,可以是线性的或圆形的。本篇文章将深入探讨Android中的ProgressBar及其两个主要子类SeekBar和RatingBar的使用方法。 首先,我们来了解...

    Android 控件 ProgressBar进度条源码

    `assets`目录通常用于存放非资源文件,如文本、音频等,与ProgressBar的关系不大,但在某些情况下,如果进度信息存储在这些文件中,可以读取它们来更新ProgressBar的状态。 `教程说明见这里.txt`文件可能是对整个...

    Android应用源码之ProgressBar 几乎全部的用法

    在Android开发中,ProgressBar是一个非常重要的组件,它用于显示进度或等待状态,为用户提供反馈,表明应用程序正在进行后台处理。ProgressBar提供了多种样式和用法,包括水平、垂直、圆形以及自定义样式。本教程将...

    android 实现progressbar的简单自定义动画

    在Android开发中,ProgressBar是用户界面中非常常见的一种组件,用于显示进度或加载状态。有时候,为了提升用户体验和界面美观性,我们可能需要对默认的ProgressBar进行自定义,特别是添加动画效果。本教程将深入...

    android自定义progressBar颜色,圆角

    在实际应用中,可能还需要根据进度的更新动态调整颜色或者圆角大小,这可以通过监听Progress Bar的进度变化来实现,使用`setOnSeekBarChangeListener`(如果使用SeekBar的话)或自定义监听器。 总结来说,自定义...

    android progressbar 垂直布局

    在Android开发中,ProgressBar是用于显示进度或加载状态的一个组件,通常我们看到的都是水平方向的条形或圆形进度条。然而,有时候根据界面设计的需求,我们可能需要将ProgressBar设置为垂直布局,这就是"android ...

    android progressbar使用系列集合

    在Android开发中,ProgressBar是一个非常常见的组件,用于展示任务的进度或者表示正在执行的操作。本篇文章将深入探讨如何自定义ProgressBar以满足特定的设计需求,尤其是根据系统的风格进行定制,包括改变默认背景...

    Android progressBar的简单使用例子

    在Android开发中,ProgressBar是一个非常重要的组件,它用于显示进度状态,可以是确定性的,比如下载文件时显示的百分比,也可以是不确定性的,比如在后台执行任务时展示的旋转指示器。本教程将深入讲解如何在...

    Android自定义ProgressBar

    在Android开发中,ProgressBar是用户界面中非常常见的一种组件,用于显示进度或加载状态。而自定义ProgressBar则允许开发者根据项目需求,创建独特且符合品牌形象的进度条样式。本篇文章将深入探讨如何在Android中...

    android ProgressBar 全部的用法

    在Android开发中,ProgressBar是一个非常重要的组件,它用于表示任务的进度或操作的等待状态。ProgressBar提供了多种样式和用法,适用于不同的界面需求。本文将详细介绍Android ProgressBar的使用方法,帮助开发者更...

    多种风格的Android 自定义progressbar控件

    在Android开发中,ProgressBar是一个非常重要的控件,它用于显示进度状态,比如加载数据或执行长时间操作时。自定义ProgressBar可以极大地提升应用的用户体验和视觉吸引力。本项目"多种风格的Android自定义...

    Android:ProgressBar的初步学习

    在Android开发中,`ProgressBar`是一个非常常见的组件,它用于显示进度或加载状态,为用户提供反馈,表明应用程序正在进行后台操作。本项目是一个针对初学者的`ProgressBar`初步学习实例,旨在帮助开发者理解如何在...

    花样Android_ProgressBar_史上最强大讲解.doc

    ### 花样Android_ProgressBar_史上最强大讲解 #### 进度条(ProgressBar)概述 在Android开发中,`ProgressBar`是一种常见的UI组件,用于显示任务或操作的完成进度。这种组件对于提升用户体验至关重要,尤其是在...

    Android中使用ProgressBar实现进度条

    在Android开发中,ProgressBar是一个非常重要的组件,它用于显示进度状态,可以是圆形或水平的。这个组件在用户等待操作完成时提供了良好的用户体验,比如在下载、上传、解压等耗时操作中常见。本篇文章将深入探讨...

    Android代码-Progressbar

    Android自定义Progressbar 圆形进度条CircleBarView 教程博客:Android自定义View——从零开始实现圆形进度条 效果展示: 水波浪进度框WaveProgressView 教程博客:Android自定义View——从零开始实现...

    progressbar控件(Android)

    在Android开发中,ProgressBar是一个非常重要的控件,它用于显示进度状态,比如数据加载、文件下载等操作。在Android 2.3版本中,开发者可以使用ProgressBar来为用户创建直观的等待反馈,增强用户体验。本篇文章将...

Global site tag (gtag.js) - Google Analytics