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>

  执行流程

  

  运行效果如下 

  

  

  

  

posted @ 2011-12-08 16:56  David.Meng  阅读(2486)  评论(0编辑  收藏  举报