6.4 ProgressBar和SeekBar
Android应用开发入门经典(第3版)
ProgressBar(android.widget.Progressbar) 和SeekBar(android.widget.SeekBar)能够揭示当前发生的事件状态。例如当用户界面是一个图像文件下载时,可能需要展示一个ProgressBar。圆形的并且揭示当前正在发生一些事情的ProgressBar被称为不确定的进度栏。横向的ProgressBar能够揭示事件的完成情况。SeekBar与横向的ProgressBar类似,但用户可以将SeekBar设置到某个具体的位置。例如SeekBar可用于设置VideoView中的位置。
本节在介绍 ProgressBar 和 SeekBar 的细节之前,将首先介绍如何使用AsyncTask(android.os.AsyncTask)。AsyncTask用于后台的处理。将紧张的任务移到后台是非常重要的。本节将介绍后台任务如何在 UI 线程中与ProgressBar进行通信。来自AsyncTask的更新将会使用横向的ProgressBar和SeekBar揭示出来。
图6.10给出了一个ProgressBar、一个横向的ProgressBar以及一个SeekBar。
6.4.1 AsyncTask
使用AsyncTask类可以管理后台操作,这些后台操作最终会将结果返回给UI线程。
要使用AsyncTask,必须要创建一个AsyncTask的子类,并实现相应的回调方法。
onPreExecute()——后台处理开始之前在UI线程中运行。
doInBackground()——运行在后台,所有实际的工作都在这个方法中完成。
publishProgress()——这个方法由doInBackground()方法调用,它定期将后台进程的进度通知给UI线程。这个方法将信息发送到UI进程。使用这个机会将更新的进度发送到进度栏,这样用户就能够看到进度了。
onProgressUpdate()——当doInBackground()调用publishProgress()时,在UI线程中运行。这个方法从后台进程中接收信息。使用这个机会跟新ProgressBar控件,这样用户就能够看到进度了。
当使用execute()方法启动之后,AsyncTask类会在后台线程中进行处理,不会阻塞UI线程。
onPostExecute()——后台处理结束之后在UI线程中运行。
AsyncTask使用3个泛型,它们分别表示传入任务的参数、所使用的进度值以及任务最重的返回值。读者可以像下面这样使用这些泛型来定义类:
在onPreExecute()方法中将一个不确定的ProgressBar方法的可见性设置为了可见。换句话说,在第4行,应用显示了一个不确定的ProgressBar。在第26行的onPostExecute()方法中将同一个ProgressBar设置成了不可见。将ProgressBar与这些方法联系起来之后就能够使得它在后台任务运行的时候变得可见。
在ShowProgressTask中,doInBackround()方法递增一个整数值并将这个值作为参数来调用publishProgess()。第 10 行的 sleep()方法用来模拟一些复杂任务的延时。它仅用于演示。onProgressUpdate()方法接受这个值并对横向的ProgressBar和SeekBar做出相应的更新。执行ShowProgressTask可按照下面的方法:
6.4.2 ProgressBar
程序清单6.4给出了AsyncTask所做的工作,即更新两个不同的ProgressBar。在ProgressActivity的onCreate()方法中定义了两个ProgressBar:
6.4.3 SeekBar
在本例中,SeekBar 与横向的进度条类似。也可以设定一个监听器来监听和响应发生在SeekBar上的变化。
在本例中,SeekBar是在代码中进行定义了,其最大值被设置成了100: