zoukankan      html  css  js  c++  java
  • Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用

      前言  

      Android里的很多控件,有许多是为了与用户进行交互的,也有一些是为了作为程序提示,显示程序运行状态的。在这里我们介绍一下ProgressBar控件的使用,它就是作为显示程序运行状态存在的。

      思路

      在这个应用一开始是看不到进度条的,我们布局一个按钮,然后单击这个按钮,再然后我们创建一个新的进程来假装程序很”忙碌“,可以在进程当中取得运行时的进度,在运行过程中,将运行的进度通过TextView显示出来。

      因为这个进程是新开启的,新开启的进程无法访问Activity里的控件,也就无法把运行状态传递出来,所以我们要通过Handler和Message对象将新开启的进程里的状态传递出来,最后由Activity的Handler事件接收取得的运行状态。

      实现步骤

      一:布局文件编写

      1.1:布局文件main.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
         >
        <TextView  
           android:layout_width="fill_parent" 
           android:layout_height="wrap_content" 
           android:text="@string/hello"
           android:id="@+id/tv"
        />
        <ProgressBar 
           android:id="@+id/pb"
           style="?android:attr/progressBarStyleHorizontal"
           android:layout_width="300dp"
           android:layout_height="wrap_content"
           android:max="200" 
           android:visibility="gone"
         />
        <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="运行进程"
           android:id="@+id/btn"
        />
      </LinearLayout>

      二:代码文件编写

      2. 1:MainActivity.java

      package com.menglin.progressbarandhandler;

      import android.app.Activity;
      import android.os.Bundle;
      import android.os.Handler;
      import android.os.Message;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.ProgressBar;
      import android.widget.TextView;

      public class MainActivity extends Activity
      {
         //自定义Handler信息代码,用以作为识别事件处理
         protected static final int GUI_STOP_NOTIFIER = 0;
         protected static final int GUI_THREADING_NOTIFIER = 1;
         //声明一个Button对象btn
         private Button btn;
         //声明一个TextView对象tv
         private TextView tv;
         //声明一个ProgressBar对象pb
         private ProgressBar pb;

         //进度条计数器
         private int intCount = 0;
         @Override
         public void onCreate(Bundle savedInstanceState)
         {
            super.onCreate(savedInstanceState);
            //加载布局文件main.xml
            setContentView(R.layout.main);
            //通过findViewById()方法得到Button对象
            btn = (Button)findViewById(R.id.btn);
            //通过findViewById()方法得到TextView对象
            tv = (TextView)findViewById(R.id.tv);
            //通过findViewById()方法得到ProgressBar对象
            pb = (ProgressBar)findViewById(R.id.pb);
            //调用setIndeterminate()方法Indeterminate赋值为false,我们翻阅Android的SDK得到以下信息,Change the indeterminate mode for this progress bar 意思是说以不确定的方式改变这个进度条,也就是说可以改变进度条的指示
            pb.setIndeterminate(false);
            //给按钮绑定单击事件
            btn.setOnClickListener(listener);
       }
     
       //定义匿名Handler内部类用来处理从消息队列中取出的消息

       Handler MessageHandler = new Handler()
       {

          //当从消息队列中取出消息对象会自动调用此方法
          public void handleMessage(Message message)
          {
             switch (message.what)
             {
                  //当离开进程时
                  case MainActivity.GUI_STOP_NOTIFIER:

                  //设置TextView的文本信息为“运行进程完毕”
                    tv.setText(R.string.end);
                    //将ProgressBar设置为可为不可见
                    pb.setVisibility(View.GONE);
                      //终止当前的线程
                     Thread.currentThread().interrupt();
                     break;
                   //当还在进程中时
                   case MainActivity.GUI_THREADING_NOTIFIER:
                     //如果线程没有被中断
                         if(!Thread.currentThread().isInterrupted())
                     {
                      //设置进度条的进度标识
                      pb.setProgress(intCount);

                  //设置TextView的文本信息为“加载中...请稍后(%百分比%)”
                      tv.setText(getResources().getText(R.string.start)+ "(" + Integer.toString(intCount) + "%}");
                     }
                    break;
             }

           }
         };
     
       //单击事件
       private OnClickListener listener = new OnClickListener()
       {
          @Override
          public void onClick(View v)
          {
             //将ProgressBar设置为可见
             pb.setVisibility(View.VISIBLE);
             //设置ProgressBar初始为0
             pb.setProgress(0);
             //设置ProgressBar最多为100
             pb.setMax(100);
             //开启一个新的线程
             new Thread(new Runnable()
             {

              // run()方法里面的代码会被自动调用

                public void run()
                {
                   for(int i = 0;i < 10; i++)
                   {
                      try
                      {
                         //计数器用以识别加载的进度
                         intCount = (i + 1) * 10;
                         //每运行一次循环休眠1秒
                         Thread.sleep(1000);
                         //当进程运行9秒后显示运行结束
                         if(i == 9)
                         {
                            //将Message作为参数传递给Handler
                            Message message = new Message();
                            //自定义消息的代码以便进行相应的处理

                            message.what = MainActivity.GUI_STOP_NOTIFIER;
                            //发送Message对象,把Message对象压入到消息队列的末尾,在handleMessage它将被接收                      MessageHandler.sendMessage(message);
                         }
                         else
                         {
                            //将Message作为参数传递给Handler
                            Message message = new Message();
                            //自定义消息的代码以便进行相应的处理

                            message.what = MainActivity.GUI_THREADING_NOTIFIER;
                            //发送Message对象,把Message对象压入到消息队列的末尾,在handleMessage它将被接收MessageHandler.sendMessage(message);
                         }
                      } 
                      catch (Exception e)
                      {
                         e.printStackTrace();
                      }
                   }
                }
             }).start();
           }
         };
      }

      三:常量文件

      3.1 strings.xml

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
         <string name="hello">Hello World, MainActivity!</string>
         <string name="app_name">ProgressBarAndHandlerDemo</string>
         <string name="start">加载中...请稍后</string>
         <string name="end">运行进程完毕</string> 
      </resources>

      执行流程

      

      运行效果如下 

      

      

      

      

  • 相关阅读:
    hdu1028 Ignatius and the Princess III ——DP
    csu1290 Random Integers ——DP入门题&&比赛残留题
    uva11462 Age Sort ——计数排序
    uva127 ``Accordian'' Patience ——链表模拟题
    入门经典 7.1.1 除法
    poj1122&&zoj1053 FDNY to the Rescue! ——最短路入门题_Dijkstra算法
    zoj3696 Alien's Organ ——概率题
    poj1018 Communication System ——贪心+枚举
    WPS for Ubuntu!
    ural1057 Amount of Degrees ——数位DP
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2280601.html
Copyright © 2011-2022 走看看