How to display progress dialog before starting an activity in Android?
Asked Answered
A

2

36

How do you display a progress dialog before starting an activity (i.e., while the activity is loading some data) in Android?

Archil answered 5/3, 2011 at 6:32 Comment(1)
you should remove the spaces you have before your question... It is getting picked up as a code block and making your question harder to read.Cairngorm
I
65

You should load data in an AsyncTask and update your interface when the data finishes loading.

You could even start a new activity in your AsyncTask's onPostExecute() method.

More specifically, you will need a new class that extends AsyncTask:

public class MyTask extends AsyncTask<Void, Void, Void> {
  public MyTask(ProgressDialog progress) {
    this.progress = progress;
  }

  public void onPreExecute() {
    progress.show();
  }

  public void doInBackground(Void... unused) {
    ... do your loading here ...
  }

  public void onPostExecute(Void unused) {
    progress.dismiss();
  }
}

Then in your activity you would do:

ProgressDialog progress = new ProgressDialog(this);
progress.setMessage("Loading...");
new MyTask(progress).execute();
Inger answered 5/3, 2011 at 6:40 Comment(1)
Hey thanks for the answer, I'm doing exactly this, but for some reason the progressDialog pops up when the phone is in landscape orientation but not when it's in portrait orientation. Do you have any ideas on this? I've tried starting the dialog from the first class (the one that calls myTask) but still the same problem. Sometimes, the dialog works in portrait mode but it looks out of focus and this happens only once in 10 tries.Flitch
L
3

When you start a long-running process on Android, its always advisable to do it on another thread. You can then use the UI thread to display a progress dialog. You cannot display a progress dialog in the same (UI) thread in which the process is running.

Do the following to start your process

pd = ProgressDialog.show(this, "Synchronizing data", "Please wait...");
Thread t = new Thread(this);
t.start();

For this your activity should implement Runnable as follows

public class SyncDataActivity extends Activity implements Runnable

And finally a method to perform the long-running process

@Override
public void run() {
      //your code here
}
Leg answered 5/3, 2011 at 6:37 Comment(7)
If you use threads you have to manage various things such as executing post-task code on the UI thread.Inger
Matthew... Can you setDaemon to true in AsyncTask?Keel
Hi,I tried as you guys told, but still its not working. I am posting my code below. can anyone please tell that what i am doing wrong?Archil
public class Startup extends Activity implements Runnable{ private ProgressDialog pd @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.startup); new MyTask(pd).execute(); } }Archil
private class MyTask extends AsyncTask<Void, Void, Void> { private ProgressDialog progress; public MyTask(ProgressDialog progress) { this.progress = progress; } protected void onPreExecute() { progress = ProgressDialog.show(Startup.this, "", "Loading. Please wait...", true); } @Override protected Void doInBackground(Void... arg0) { //Excecuting some methods return null; } @Override protected void onPostExecute(Void result) { progress.dismiss(); }}Archil
@Neha.. It is not clear to me why your Activity implements Runnable. Consider placing the method that gets the data into doInBackground. Consider returning the data from the getData method. This data will be automagically passed to onPostExecute. Update the UI with the data in onPostExecute. If the UI update takes time, then you have a bigger problem, but I believe that that problem can be solved using a handler loop.Keel
@Jal: Thanks a lot for your suggestion :) By the way, Matthew's solution worked for me.Archil

© 2022 - 2024 — McMap. All rights reserved.