pulancheck1988
pulancheck1988

Reputation: 2064

Android progress dialog force showing

I have this lines of code:

1)    m_ProgressDialog = ProgressDialog.show(m_Context, "", m_Context.getString(R.string.dictionary_loading));
2)   //important code stuff: interact with db, change some textview values (= 2-3 seconds if i'm unlucky)
3)   m_ProgressDialog.dismiss();

But what happens is that phase 2) happens before 1).. which is wrong. First UI freezes then dialog appears..

phase 2) is some code that interacts with DB, might also change some textViews..but since this might take a while i decided to show that progress dialog so that user would know that really important stuff is going on. I cant use Async for these operations since UI code & db code is mengled, it will only complicate my life

How can i force dialog to show at request ??.. to me it seams that code presented just adds it in a "To do list when i have some free time & i dont have time now" stack..

Upvotes: 1

Views: 876

Answers (3)

Windgate
Windgate

Reputation: 430

For most of cases if you want to simply have 2 methods, ShowLoading() and HideLoading() just use this

public static void ShowLoading()
{
   HideLoading();
    
   myLoadingThread = new Thread(new ThreadStart(LoadingThread));
   myLoadingThread.Start();
}

private static void LoadingThread()
{
   Looper.Prepare();
    
   myProgressDialog = new ProgressDialog(myActivity, 
      Resource.Style.AppTheme_Dialog);
                
   myProgressDialog.SetMessage("Loading..."); // Or a @string...

   myProgressDialog.SetIcon(Resource.Drawable.your_loading_icon);
                
   myProgressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);
   myProgressDialog.SetCancelable(false);
   myProgressDialog.Show();
    
   Looper.Loop();
}
    
public static void HideLoading()
{
   if (myProgressDialog != null)
   {
      myProgressDialog.Dismiss();
      myProgressDialog = null;
   }
    
   if (myLoadingThread != null)
      myLoadingThread.Abort();
}

Now I declare and explain the followings variables I used on my code sample, one of them is global, yes, if you don't like to use global vars, or you want to have 2 loading dialogs at a time (wtf...) look for another solution. This is just the simplest way, most friendly and free of weird code with nested methods, new classes and inheritance everywhere for such a simple thing:

private Thread myLoadingThread;
private ProgressDialog myProgressDialog;

// Some people will hate me for this, but just remember
// to call myActivity = this; on each OnStart() of your app
// and end with all your headaches 
public Activity myActivity;  

Upvotes: 0

koti
koti

Reputation: 3701

Do not use UiThread for background operations it lead to freeze of screen.You have to use separate thread like Asyc Task.

do like below

in

onCreate()
{
dialog.show();
new DownloadFilesTask().excute()
}
class DownloadFilesTask extends AsyncTask<Void,Void,Void>
{
 protected Long doInBackground(URL... urls) {
        //Background operation
         }
         return null;
     }

     protected void onProgressUpdate(Integer... progress) {

     }

     protected void onPostExecute(Long result) {
      runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    //Update you Ui here
dialog.dismiss();
                }
            });
     }
}

Upvotes: 0

ekholm
ekholm

Reputation: 2573

You are doing your work on the ui thread. You should use a separate thread for this to keep the UI (progress bar) responsive. Have a look at AsynchTask.

Upvotes: 1

Related Questions