Android深入淺出系列之執行個體應用—程式運行進度提示條應用ProgressBar和Handler的使用

來源:互聯網
上載者:User

  前言  

  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>

  執行流程

  

  運行效果如下 

  

  

  

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.