Android基础教程:handler机制实现ProgressDialog


布局文件比较简单,只有一个按钮:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <Button android:text="Login"  
  8.         android:id="@+id/loginBtn"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         />  
  12. </LinearLayout>  
本程序参照mars老师的视频写的,下面是主程序代码:
  1. package com.cloay;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.ProgressDialog;  
  5. import android.content.DialogInterface;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12.   
  13. /** 
  14.  * Myhandler.java 
  15.  * @author Cloay 
  16.  * 2011-9-6 
  17.  */  
  18. public class Myhandler extends Activity{  
  19.     private Button button;  
  20.     private ProgressDialog progressDialog;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub   
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.handler);  
  26.         button = (Button)findViewById(R.id.loginBtn);  
  27.         button.setOnClickListener(new loginBtnListener());  
  28.     }  
  29.     /* 
  30.      * 使用Handler更新UI 
  31.      */  
  32.     Handler handler = new Handler(){  
  33.   
  34.         @Override  
  35.         public void handleMessage(Message msg) {  
  36.             //设置进度条当前值,并将线程对象放入线程队列   
  37.             progressDialog.setProgress(msg.arg1);  
  38.             handler.post(updateThread);  
  39.         }  
  40.           
  41.     };  
  42.     class loginBtnListener implements OnClickListener{  
  43.   
  44.         @Override  
  45.         public void onClick(View v) {  
  46.             handler.post(updateThread);  
  47.             progressDialog = new ProgressDialog(Myhandler.this);  
  48.             progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  49.             progressDialog.setMessage("正在登陆,请稍后...");  
  50.             progressDialog.setTitle("登陆系统");  
  51.             progressDialog.setIcon(R.drawable.ask);  
  52.             progressDialog.setMax(100);  
  53.             progressDialog.setProgress(0);  
  54.             progressDialog.setCancelable(true);  
  55.             progressDialog.setButton("取消"new DialogInterface.OnClickListener() {  
  56.                   
  57.                 @Override  
  58.                 public void onClick(DialogInterface dialog, int which) {  
  59.                     // TODO Auto-generated method stub   
  60.                     dialog.dismiss();  
  61.                 }  
  62.             });  
  63.             progressDialog.show();  
  64.         }  
  65.           
  66.     }  
  67.     Runnable updateThread = new Runnable() {  
  68.         int i = 0;  
  69.         @Override  
  70.         public void run() {  
  71.             i += 5;  
  72.             Message msg = handler.obtainMessage();    //得到一个消息对象   
  73.             //将msg对象的参数设置为i,Message类共有两个参数arg1和arg2,用这两个成员变量传递消息的优点是系统性能消耗最少   
  74.             msg.arg1 = i;                 
  75.             try {  
  76.                 Thread.sleep(100);  
  77.             } catch (InterruptedException e) {  
  78.                 e.printStackTrace();  
  79.             }  
  80.             //将msg压入消息队列,sendMessage方法是异步的,不等消息被处理,该方法就返回,继续往下执行   
  81.             handler.sendMessage(msg);  
  82.             if(i == progressDialog.getMax()){  
  83.                 //当i达到最大值时,从消息队列中删除msg   
  84.                 handler.removeCallbacks(updateThread, msg);  
  85.                 progressDialog.dismiss();  
  86.             }  
  87.         }  
  88.           
  89.     };  
  90. }  
运行效果图如下:

相关内容