Creating a Progress Dialog

A ProgressDialog is an extension of the AlertDialog class that can display a progress animation in the form of a spinning wheel, for a task with progress that's undefined, or a progress bar, for a task that has a defined progression. The dialog can also provide buttons, such as one to cancel a download.

Opening a progress dialog can be as simple as calling ProgressDialog.showQ. For example, the progress dialog shown to the right can be easily achieved without managing the dialog through the onCreateDialog(int) callback, as shown here:

The setup is simple. Most of the code needed to create a progress dialog is actually involved in the process that updates it. You might find that it's necessary to create a second thread in your application for this work and then report the progress back to the Activity's UI thread with a

Handler object. If you're not familiar with using additional threads with a Handler, see the example Activity below that uses a second thread to increment a progress dialog managed by the Activity.

Example ProgressDialog with a second thread

This example uses a second thread to track the progress of a process (which actually just counts up to 100). The thread sends a Message back to the main Activity through a Handler each time progress is made. The main Activity then updates the ProgressDialog.

e package com.example.progressdialog; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; 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;

public class NotificationTest extends Activity { static final int PROGRESS_DIALOG = 0; Button button;

ProgressThread progressThread; ProgressDialog progressDialog;

/** 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.progressDialog); button.setOnClickListener(new OnClickListener(){ public void onClick(View v) {

showDialog(PROGRESS_DIALOG);

protected Dialog onCreateDialog(int id) { switch(id) { case PROGRESS_DIALOG:

progressDialog = new ProgressDialog(NotificationTest.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Loading..."); progressThread = new ProgressThread(handler); progressThread.start(); return progressDialog; default:

return null;

//Define the Handler that receives messages from the thread and update progress final Handler handler = new Handler() {

public void handleMessage(Message msg) {

int total = msg.getData().getInt("total"); progressDialog.setProgress(total); if (total >= 100){

dismissDialog(PROGRESS_DIALOG);

progressThread.setState(ProgressThread.STATE_DONE);

/** 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;

mState = STATE_RUNNING; total = 0;

Thread.sleep(100); } catch (InterruptedException e) {

Log.e("ERROR", "Thread Interrupted");

Message msg = mHandler.obtainMessage();

b.putInt("total", total);

msg.setData(b);

mHandler.sendMessage(msg);

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

0 0

Post a comment