【转】24. android dialog ——ProgressDialog 进度条对话框详解

原文网址;http://blog.csdn.net/jamesliulyc/article/details/6375598

首先在onCreateDialog方法里创建一个ProgressDialog,如下:

 

[java] view plaincopy
 
  1. //this表示该对话框是针对当前Activity的  
  2. progressDialog = new ProgressDialog(this);  
  3. //设置最大值为100  
  4. progressDialog.setMax(100);  
  5. //设置进度条风格STYLE_HORIZONTAL  
  6. progressDialog.setProgressStyle(  
  7.         ProgressDialog.STYLE_HORIZONTAL);  
  8. progressDialog.setTitle("进度条对话框");  

 

 

接下来就是进度条的进度更新,因为对话框对象一直被当前Dialog保存着,所以onCreateDialog在下次调用对话框时不会在被调,所以

进度条更新操作不能在onCreateDialog里面,而是在onPrepareDialog里面进行。

首先要将进度条置为0

 

[java] view plaincopy
 
  1. progressDialog.incrementProgressBy(-progressDialog.getProgress());  

 

increamentProgressBy源码中是调用了ProgressBar的setProgress(mProgress + diff); mProgress是当前进度值,这里的diff就是-progressDialog.getProgress(),最后结果为0,所以也可以这么用,效果和调用incrementProgressBy一样的,如下:

 

[java] view plaincopy
 
  1. progressDialog.onStart();  
  2. progressDialog.setProgress(0);  

 

值得一提的是,不能直接只用setProgress(0)来设置,这样的话,第一次弹出对话框效果可以和上面的一样,但是之后再弹出对话框的进度一直都是100。为什么这里不能直接用setProgress(0),查看源码可以知道,

 

[c-sharp] view plaincopy
 
  1. if (mHasStarted) {  
  2.       mProgress.setProgress(value);  
  3.       onProgressChanged();  
  4. else {  
  5.       mProgressVal = value;  
  6. }  

 

mHasStarted第一次调用的时候是true,当进度条达到100%时会调用onStop方法(此方法为protected,无法直接调用),将mHasStarted设置为false,也就是无法setProgress(value)了,只能通过onStart来将mHasStarted设置为true。

 

当点击“显示进度条对话框”按钮,这时候需要很耗时然后才显示对话框,而往往都会导致假死,如果超过5秒未响应将强制关闭,所以这里需要添加个多线程来做进一步处理。而进度条的增加效果是很快的,所以这这里需要让大家看到效果,得停几毫秒后再继续。

为了使主线程不受影响(处理当前Activity的线程),在点击按钮且耗时操作完后需要发送消息给主线程,主线程再做相应处理。线程之间的消息传递和异步处理是通过Handler来做处理的,相关代码如下:

 

[java] view plaincopy
 
  1. new Thread() {  
  2.     public void run() {  
  3.         for(int i=0; i<=100; i++) {  
  4.             handler.sendEmptyMessage(INCREASE);  
  5.             if(progressDialog.getProgress() >= 100) {  
  6.                 break;  
  7.             }  
  8.             try {  
  9.                 Thread.sleep(50);  
  10.             } catch (InterruptedException e) {  
  11.                 e.printStackTrace();  
  12.             }  
  13.         }  
  14.     }  
  15. }.start();  

 

 

Handler的处理如下:(Handler具体说明网上很多,可以参考此处 http://my.unix-center.net/~Simon_fu/?p=652

 

[java] view plaincopy
 
  1. handler = new Handler() {  
  2.     @Override  
  3.     public void handleMessage(Message msg) {  
  4.         switch(msg.what) {  
  5.             case INCREASE:  
  6.                 progressDialog.incrementProgressBy(1);  
  7.                 if(progressDialog.getProgress() >= 100) {  
  8.                 //  progressDialog.dismiss();  
  9.                 }  
  10.                 break;  
  11.         }  
  12.         super.handleMessage(msg);  
  13.     }  
  14. };  

 

 

解释就到这里,先看个效果图:

 

 

实现步骤:

第一步,一个按钮用来点击后弹出对话框的

res/layout/progress_dialog_layout.xml

 

[xhtml] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="wrap_content">  
  6.   <Button android:id="@+id/button"  
  7.     android:text="显示进度条对话框"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content"/>  
  10. </LinearLayout>  

 

 

第二步,

src/com/dialog/activity/ProgressDialogActivity.java

 

[java] view plaincopy
 
  1. package com.dialog.activity;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Dialog;  
  5. import android.app.ProgressDialog;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11.   
  12. public class ProgressDialogActivity extends Activity {  
  13.       
  14.     private final int PROGRESS_DIALOG = 1;  
  15.       
  16.     private final int INCREASE = 0;  
  17.       
  18.     private ProgressDialog progressDialog = null;  
  19.       
  20.     private Handler handler = null;  
  21.       
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.progress_dialog_layout);  
  26.           
  27.         Button button = (Button) findViewById(R.id.button);  
  28.         View.OnClickListener listener =   
  29.             new View.OnClickListener() {  
  30.                   
  31.                 @Override  
  32.                 public void onClick(View view) {  
  33.                     showDialog(PROGRESS_DIALOG);  
  34.                 }  
  35.             };  
  36.         button.setOnClickListener(listener);  
  37.           
  38.         handler = new Handler() {  
  39.             @Override  
  40.             public void handleMessage(Message msg) {  
  41.                 switch(msg.what) {  
  42.                     case INCREASE:  
  43.                         progressDialog.incrementProgressBy(1);  
  44.                         if(progressDialog.getProgress() >= 100) {  
  45.                         //  progressDialog.dismiss();  
  46.                         }  
  47.                         break;  
  48.                 }  
  49.                 super.handleMessage(msg);  
  50.             }  
  51.         };  
  52.     }  
  53.       
  54.     @Override  
  55.     public Dialog onCreateDialog(int id) {  
  56.         switch(id) {  
  57.             case PROGRESS_DIALOG:     
  58.                 //this表示该对话框是针对当前Activity的  
  59.                 progressDialog = new ProgressDialog(this);  
  60.                 //设置最大值为100  
  61.                 progressDialog.setMax(100);  
  62.                 //设置进度条风格STYLE_HORIZONTAL  
  63.                 progressDialog.setProgressStyle(  
  64.                         ProgressDialog.STYLE_HORIZONTAL);  
  65.                 progressDialog.setTitle("进度条对话框");  
  66.                 break;  
  67.         }  
  68.         return progressDialog;  
  69.     }  
  70.       
  71.     @Override  
  72.     public void onPrepareDialog(int id, Dialog dialog) {  
  73.           
  74.         switch(id) {  
  75.             case PROGRESS_DIALOG:  
  76.                 //将进度条清0  
  77.                 progressDialog.incrementProgressBy(-progressDialog.getProgress());  
  78.                 new Thread() {  
  79.                     public void run() {  
  80.                         for(int i=0; i<=100; i++) {  
  81.                             handler.sendEmptyMessage(INCREASE);  
  82.                             if(progressDialog.getProgress() >= 100) {  
  83.                                 break;  
  84.                             }  
  85.                             try {  
  86.                                 Thread.sleep(50);  
  87.                             } catch (InterruptedException e) {  
  88.                                 e.printStackTrace();  
  89.                             }  
  90.                         }  
  91.                     }  
  92.                 }.start();  
  93.                 break;  
  94.         }  
  95.     }  
  96. }  

 

 

 

 

 源码下载地址:http://download.csdn.net/source/3244868

posted on 2015-05-11 22:13  wi100sh  阅读(665)  评论(0编辑  收藏  举报

导航