Browse » Home » Resource, Tutorial » Blog article: Dialog工具箱 – ProgressDialog

在此前的几个教程中引出过一些Dialog的使用方法,可从来没有系统全面的介绍Android平台上所有Dialog家族成员的情况(其实官方文档有相当明确的说明:参考1参考2)。对于大部分人可以直接根据官方文档获得有关Dialog的使用方法,AR给出的有关Dialog参考教程可以作为额外的补充。

在这里为大家介绍ProgressDialog的使用方法:

ProgressDialog

1) 创建一个普通ProgressDialog(不带有ProgressBar)所必须的几个参数

  • Context: 指定当前Dialog的Container
  • Title:对话框标题
  • Message:对话框主体所显示的信息
  • Indeterminate:不确定性属性,这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。

2)以下两个为可选参数

  • Cancelable:增加一个可以Cancel当前Dialog的按钮,强制退出。
  • CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。

快速创建一个ProgressDialog的方法(代码片段):

    private ProgressDialog dialog;
    private Handler handler = new Handler() {
        public void handleMessage(Message msg)
        {
        	dialog.dismiss();
        }
    };
    private Thread checkUpdate = new Thread()
    {
    	public void run() {  

    	  try {
			sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	  handler.sendEmptyMessage(0);
    	}
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    

	    final Button button = (Button) findViewById(R.id.Compute);
	    button.setOnClickListener(new View.OnClickListener()
	    {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				checkUpdate.stop();
				dialog = ProgressDialog.show(ARTestDrawing2D.this,
					      "AndroidRes",
						  "I am thinking...",
						  true,true);
				checkUpdate.start();
			}

	    });
    }

上边的例子中引用了Handler(official)作为multi-thread相互传递数据的载体,接下来为ProgressDialog实现一个可视化进度条(progressBar)的方法中依然需要调用Handler(Internal),借用这个例子大家也可以多了解Handler的用法。

ProgressBar

利用一个可视化进度条取代第一个例子中比较抽象的旋转轮,让用户更加直观的了解当前任务的进度。初始化的方法如下:

dialog = new ProgressDialog(ARTestDrawing2D.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("AndroidRes");
dialog.setMessage("I am thinking...");

看起来稍微比第一个例子复杂一些,每个参数都单独利用成员方法赋值。
其中SetProgressStyle用来设置显示模式,通常为STYLE_HORIZONTAL。下边通过一个完整的例子了解它的初始化和设置方法(例子来源于Android官网):

    static final int PROGRESS_DIALOG = 0;
    Button button;
    ProgressThread checkUpdate;
    ProgressDialog dialog;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Setup the button that starts the progress dialog
        button = (Button) findViewById(R.id.Compute);
        button.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                showDialog(PROGRESS_DIALOG);
            }
        });
    }

    protected Dialog onCreateDialog(int id) {
        switch(id) {
        case PROGRESS_DIALOG:
        	dialog = new ProgressDialog(ARTestDrawing2D.this);
        	dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        	dialog.setTitle("AndroidRes");
        	dialog.setMessage("I am thinking...");
        	checkUpdate = new ProgressThread(handler);
        	checkUpdate.start();
            return dialog;
        default:
            return null;
        }
    }

    // Define the Handler that receives messages from the thread and update the progress
    final Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            int total = msg.getData().getInt("total");
            dialog.setProgress(total);
            if (total >= 100){
                dismissDialog(PROGRESS_DIALOG);
                checkUpdate.setState(ProgressThread.STATE_DONE);
                total = 0;
            }
        }
    };

    /** Nested class that performs progress calculations (counting) */
    private class ProgressThread extends Thread {
        Handler mHandler;
        final static int STATE_DONE = 0;
        final static int STATE_RUNNING = 1;
        int mState;
        int total;

        ProgressThread(Handler h) {
            mHandler = h;
        }

        public void run() {
            mState = STATE_RUNNING;
            total = 0;
            while (mState == STATE_RUNNING) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Log.e("ERROR", "AndroidRes Thread Interrupted");
                }
                Message msg = mHandler.obtainMessage();
                Bundle b = new Bundle();
                b.putInt("total", total);
                msg.setData(b);
                mHandler.sendMessage(msg);
                total++;
            }
        }

        /* sets the current state for the thread,
         * used to stop the thread */
        public void setState(int state) {
            mState = state;
        }
    }

例子理解起来相对比较容易,对两个比较主要的对象做个简单的说明:
checkUpdate: 从主线程中创建一个用于计算某项任务的线程,同时也是利用ProgessBar所追踪的对象,指示这个线程的任务进度。
handler: 利用这个Handler可以将线程中的数据实时反映到主线程中的ProgessBar,使其可以实时接收到最新进度数据。

Tags: , , ,

Posted in Resource, Tutorial |

Related Posts



Leave a Reply

You must be logged in to post a comment.