• 第33讲 UI组件_进度条ProcessBar和消息队列处理器handler


    33UI组件_进度条ProcessBar和消息队列处理器handler

    1. 进度条ProcessBar

    一个可视化的进度指示器,代表正在执行的耗时任务。可以为用户展示一个进度条,表示正在执行的任务的进度。

    当程序不能或者不需要确定任务执行的准确进度时,ProgressBar也可以只显示一个循环的圆圈。

    默认情况下,ProcessBar显示的是一个无限循环的圆圈,可以通过样式的配置,实现一个水平方向的进度条。

     XML重要属性

    android:progressBarStyle:                               默认进度条样式

    android:progressBarStyleHorizontal:            水平样式

    重要方法

    getMax():                                                              返回这个进度条的范围的上限

    getProgress():                                                      返回进度

    getSecondaryProgress():                                  返回次要进度

    incrementProgressBy(int diff):                        指定增加的进度

    isIndeterminate():                                              指示进度条是否在不确定模式下

    setIndeterminate(boolean indeterminate):          设置不确定模式下

    setVisibility(int v):                                               设置该进度条是否可视

    style="@android:style/Widget.ProgressBar.Horizontal"              /*水平方向的进度条,其他值可以是

    Widget.ProgressBar.Horizontal,Widget.ProgressBar.Small,Widget.ProgressBar.Large,

    Widget.ProgressBar.Inverse,Widget.ProgressBar.Small.Inverse,Widget.ProgressBar.Large.Inverse*/

    android:max="100"                                   //总长度

    android:progress="29"                      //初始值

    //进度条加减

    public void add(View view) {

    progressBar.incrementProgressBy(10);                 //指定增加10的进度

    }

    public void reduce(View view) {

    progressBar.incrementProgressBy(-10);                //指定增加-10的进度

    }

    2UI阻塞(第10讲有相关讲解)

    使用ProcessBar主要是在执行耗时任务时,此时需要注意UI阻塞问题。

    1post方法 解决UI阻塞

    首先利用Thread(new Runnable() 对耗时任务进行包装;

    之后,由于需要修改UI当中的组件(例如,移除ProcessBar),因此需要将其放置在任务队列中,利用view.post()方法进行包装。

    public void test(final View view) {

    new Thread(new Runnable() {

    public void run() {

    try {

    Thread.sleep(7000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    view.post(new Runnable() {             //把任务放置在任务队列中

    public void run() {

    ViewGroup group=(ViewGroup)progressBar.getParent();

    group.removeView(progressBar);                   // 移除ProcessBar

    }

    });

    }

    }).start();

    }

    3. handler消息队列处理器

    post方法虽然发送的是一个实现了Runnable接口的类对象,但是它并非创建了一个新线程,而是执行了该对象中的run方法。也就是说,整个run中的操作和主线程处于同一个线程

    这样对于那些简单的操作,似乎并不会影响。但是对于耗时较长的操作,就会出现“假死”。为了解决这个问题,就需要使得handler绑定到一个新开启线程的消息队列上,在这个处于另外线程的上的消息队列中处理传过来的Runnable对象和消息。

    Handler基本概念

    Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。

    这种机制通常用来处理相对耗时比较长的操作。

    注意1.Handler对象的实例化,要在UI 线程当中完成

    调用handler的post方法可以为UI线程的消息队列添加一个Runnable消息。

    2handler方法

    利用handler的post方法打开runnable注入任务队列。

    public class MainActivity extends Activity{

    private ProgressBar progressBar;

    private Handler handler=new Handler();

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    progressBar=(ProgressBar) findViewById(R.id.progressBar1);

    new Thread(new Runnable(){                 

    public void run() {

    try {

    Thread.sleep(6000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    handler.post(newRunnable() {

    public void run() {

    ViewGroup group=(ViewGroup) progressBar.getParent();

    group.removeView(progressBar);

    TextView textView=new TextView(MainActivity.this);

    textView.setText("下载完成!");

    group.addView(textView);

    }

    });

    }

    }).start();

    }

    }

    3、利用handler实现进度条随时间递增

    要设置一个flag标记是否进度条到达最大;

    在循环过程中,会出现已经删除了ProgressBar但是继续循环删除找不到该View的情况,因此还需要判断是否已经删除了。

    private ProgressBar progressBar;

    private Handler handler = new Handler();

    private Boolean flag = true;

    protected void onCreate(BundlesavedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    progressBar = (ProgressBar) findViewById(R.id.progressBar1);

    new Thread(new Runnable() {

    public void run() {

    while (flag) {

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    handler.post(new Runnable() {

    public void run() {

    if (progressBar.getProgress() ==progressBar.getMax()) {

    // 删除进度条,添加提示

    ViewGroup group = (ViewGroup)progressBar.getParent();

    if (group != null) {

    group.removeView(progressBar);

    TextView textView = newTextView(MainActivity.this);

    textView.setText("下载完成!!");

    group.addView(textView);

    flag = false;

    }

    }

    progressBar.incrementProgressBy(10);

    }

    });

    }

    }

    }).start();

    }

  • 相关阅读:
    29. Divide Two Integers
    leetCode 17. Letter Combinations of a Phone Number
    查找
    快速排序
    希尔排序
    插入排序
    归并排序,还有非递归方式没写
    堆排序--还有递归法没有写
    c++实现字符串全排序
    归并排序
  • 原文地址:https://www.cnblogs.com/anyuan9/p/6171589.html
Copyright © 2020-2023  润新知