zoukankan      html  css  js  c++  java
  • Android学习笔记:进度条ProgressBar的使用以及与AsyncTask的配合使用

    ProgressBar时android用于显示进度的组件。当执行一个比较耗时的操作(如io操作、网络操作等),为了避免界面没有变化让用户体验降低,提供一个进度条可以让用户知道程序还在运行。

    一、ProgressBar有如下几种常见样式

    1、默认进度条的样式为圆圈(为中等大小的圆圈)

    <ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

    注意,当样式为圆圈时,其进度不停的在旋转,只是告诉用互程序在执行,无法精确地告诉用户具体进度。

    而且默认显示就是旋转的,还无法让它停下来,只有通过程序让其隐藏(比如任务处理完成时)。 

    如果想要显示为圆形的,又要控制其停顿和旋转,需要用自定义的方式,这个不在这里介绍。

    隐藏进度条,很简单:xxxx.setVisibility(View.GONE);

    2、显示为大的尺寸的圆圈

    <ProgressBar
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

    3、显示为小的尺寸的圆圈

    <ProgressBar
    style="?android:attr/progressBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

    可以直接设置 layout_width 和 layout_height为具体的值,来控制圆圈的半径。

    4、显示为直条形的

    <ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

    对于直条形的样式,不仅可以让它向圆形一样,默认就是进度不停变化;而且还可以精确控制其进度,下面会重点介绍。

    二 、直条形进度条

    设置为一直在旋转的样式

    <ProgressBar
    android:id="@+id/progress1"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    />

    设置indeterminate属性为true,就可以显示时进度条一直在变化,该属性默认是false的。

    如果想让它停止变化,可以通过代码控制:

    ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);

    pro1.setIndeterminate(false);

    如果想让它停止时,进度显示完成,可以如下代码:

    pro1.setProgress(100);  

    注意进度条的默认最大大小是100,可以通过setMax来设置自己需要的值。

    三、精确控制进度(和AsyncTask结合)

    代码如下

    	public void startProgress(View view) {
    		final ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);
    		new AsyncTask<Integer, Integer, Integer>() {
    			@Override
    			protected Integer doInBackground(Integer... params) {
    				for (int i = 1; i <= 100; i++)
    					doSomethingTask(i);
    				return 100;
    			}
    
    			private void doSomethingTask(int num) {
    				try {
    					Thread.sleep(50);
    					publishProgress(num);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    
    			@Override
    			protected void onPostExecute(Integer result) {
    				TextView resultView = (TextView) findViewById(R.id.resultText);
    				resultView.setVisibility(View.VISIBLE);
    				resultView.setText("the result is " + result);
    				super.onPostExecute(result);
    			}
    
    			@Override
    			protected void onProgressUpdate(Integer... values) {
    				pro1.setProgress(values[0]);
    				super.onProgressUpdate(values);
    			}
    
    		}.execute(1);
    	}
    

    在AsyncTask的doInBackground方法中执行后台任务(实际上是在另外线程中执行,如io操作、网络操作。在这个方法中不能操作界面组件),如果想让进度条显示中间的进度,就可以在后台任务的执行过程中调用publishProgress方法发送进度。而执行publishProgress方法,会触发onProgressUpdate方法(该方法在主线程中进行,可以在该方法中更新界面组件,这里更新的是进度条的进度)。当doInBackground方法执行完毕后,会触发onPostExecute方法(该方法在主线程中进行,可以在该方法中更新界面组件),可以在该方法中显示任务完成后的界面,上面例子是在本文view显示下信息。

    通过上面的代码和例子,基本上就可以满足大部分场景。最后提一点的是,ProgressBar的进度只能通过代码控制,无法让用户拖动。如果想要让用户能够拖动进度(比如在视频或音频播放界面),可以使用SeekBar组件。

  • 相关阅读:
    路由器桥接是个什么玩法
    MAC使用小技巧之------用好mac电脑的10个必知的小技巧!
    学习笔记1--响应式网页+Bootstrap起步+全局CSS样式
    mysql运维必会的一些知识点整理
    面试小结1--填空题
    CSS技术实例1-使用CSS计数器实现数值计算小游戏实例页面
    编译8.0
    解决Windows 10 1809 使用管理员权限运行的程序无法浏览网络驱动器的问题
    android sdk
    酷卓教程 明明已经已经有了面具Magisk 确无法正常使用root权限
  • 原文地址:https://www.cnblogs.com/51kata/p/4132081.html
Copyright © 2011-2022 走看看