User login



Syndicate content
Add to Google


Using threads and ProgressDialog

SDK Version: 
M5

This is a simple tutorial to show how to create a thread to do some work while displaying an indeterminate ProgressDialog. Click here to download the full source.

We'll calculate Pi to 800 digits while displaying the ProgressDialog. For the sake of this example I copied the "Pi" class from this site.

We start with a new Android project, only thing I needed to change was to give that TextView an id in main.xml so that I could update it in the Activity.

Because this Activity is so small I'll show you the whole thing and then discuss it at the end:

  1. public class ProgressDialogExample extends Activity implements Runnable {
  2.  
  3.     private String pi_string;
  4.     private TextView tv;
  5.     private ProgressDialog pd;
  6.  
  7.     @Override
  8.     public void onCreate(Bundle icicle) {
  9.         super.onCreate(icicle);
  10.         setContentView(R.layout.main);
  11.  
  12.         tv = (TextView) this.findViewById(R.id.main);
  13.         tv.setText("Press any key to start calculation");
  14.     }
  15.  
  16.     @Override
  17.     public boolean onKeyDown(int keyCode, KeyEvent event) {
  18.  
  19.         pd = ProgressDialog.show(this, "Working..", "Calculating Pi", true,
  20.                 false);
  21.  
  22.         Thread thread = new Thread(this);
  23.         thread.start();
  24.  
  25.         return super.onKeyDown(keyCode, event);
  26.     }
  27.  
  28.     public void run() {
  29.         pi_string = Pi.computePi(800).toString();
  30.         handler.sendEmptyMessage(0);
  31.     }
  32.  
  33.     private Handler handler = new Handler() {
  34.         @Override
  35.         public void handleMessage(Message msg) {
  36.             pd.dismiss();
  37.             tv.setText(pi_string);
  38.  
  39.         }
  40.     };
  41.  
  42. }

So we see that this Activity implements Runnable. This will allow us to create a run() function to create a thread.

In the onCreate() function on line 18 we find and initialize our TextView and set the text telling the user to press any key to start the computation.

When the user presses a key it will bring us to the onKeyDown() function on line 27. Here we create the ProgressDialog using the static ProgressDialog.show() function, and as a result the pd variable is initialized. We also create a new Thread using the current class as the Runnable object. When we run thread.start() a new thread will spawn and start executing the run() function.

In the run() function we calculate pi and save it to the String pi_string. Then we send an empty message to our Handler object on line 40.

Why use a Handler? We must use a Handler object because we cannot update most UI objects while in a separate thread. When we send a message to the Handler it will get saved into a queue and get executed by the UI thread as soon as possible.

When our Handler receives the message we can dismiss our ProgressDialog and update the TextView with the value of pi we calculated. It's that easy!

Comments

Submitted by Anonymous (not verified) on Tue, 04/01/2008 - 01:08.

How can I cancel the computerizing thread when I cancel the progress dialog?

Submitted by hobbs on Fri, 04/04/2008 - 02:18.
Submitted by Anonymous (not verified) on Fri, 03/21/2008 - 16:02.

I am trying this with a new class.. however it says Can't call handler inside the thread that has not called Looper.preapre().

Tryied to put Looper.prepare() in the calling thread.. but no use.

Could you explain what could be wrong here..

Regards,
Raja Nagendra Kumar
C.T.O
www.tejasoft.com

Submitted by hobbs on Fri, 03/21/2008 - 20:48.

The handler runs in whatever thread created it. So if you're not creating the instance of the new class in the UI thread then the handler isn't running in the UI thread and you will have a problem.

Submitted by Anonymous (not verified) on Sat, 02/09/2008 - 06:18.

It get to the run function yes, but after that never goes to handleMessage function..

Thanks.

Submitted by Anonymous (not verified) on Fri, 02/08/2008 - 18:57.

No the text does not change at all.. I´ve been doing some test, and it seems it never enter here -->

public void handleMessage(Message msg) {
pd.dismiss();
tv.setText(pi_string);

}

Any idea?..

Submitted by hobbs on Fri, 02/08/2008 - 20:40.

Does it ever get to the run() function on 38?

Submitted by Anonymous (not verified) on Sat, 02/09/2008 - 08:30.

Yes it get to the run function..

Submitted by Anonymous (not verified) on Fri, 02/08/2008 - 11:57.

Thanks but it´s not working for me, I don´t see the dialog dismiss..

Submitted by hobbs on Fri, 02/08/2008 - 12:48.

The dialog never goes away? Does the text view get set with the value?

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
Because you are not logged in, we must determine if you are a human or an Android designed to spam the internet. (Hint: All characters are lowercase)
                      _        
_ __ __ _ __| | ___
| '_ \ / _` | / _` | / __|
| | | | | (_| | | (_| | | (__
|_| |_| \__, | \__,_| \___|
|_|
Enter the code depicted in ASCII art style.