Andro Selva
Andro Selva

Reputation: 54330

Show progress Dialog while the UI gets customized

I already have idea on how to use a Progress Dialog when background action is being performed. But my question is how do I show a progress Dialog when I am dynamically inflating a huge layout.

Since I can't inflate a view in another Thread, I am using the main UI thread. Due to this my progress dialog is not getting priority and it doesn't show up. My UI hangs for several seconds until it gets loaded fully. I tried several approcahes but none seems to work.

        progress.show(context,"","inflating UI...");   
        setNewContent(R.layout.my_profile,R.id.my_profile_menu_button,R.id.my_profile_all_elements_layout);
                populateProfileList(); //Dynamic nested layouts being inflated.

I am basically looking for dynamic layout changes based on user actions. So I dont have any other way other than creating dynamic views. Can anyone suggest me a helpful idea.

Upvotes: 4

Views: 1138

Answers (3)

Opiatefuchs
Opiatefuchs

Reputation: 9870

I had an similar problem with ui-thread. I wanted to add much views to my layout at runtime, I wanted to show a ProgressDialog to inform the user, that it could take a while. I had tried it with AsyncTask, but the only chance to do this, was to implement my ui-methods into the onPostExecute-Method of AsyncTask. But this just freezes the ProgressDialog, because ProgressDialog even works on ui-thread. I found a solution, maybe not the best, but it works. Before starting ui-action, I show a Toast. Then, I created a Thread with a handler and delayed the execution. After ui-action was done, I showed a new Toast. Delay the thread, gives the Toast enough time to get showed:

    Toast.makeText(ActivityContext.this,
                  R.string.start_message,
          Toast.LENGTH_SHORT).show();

    final Handler uiHandler = new Handler();

    final Thread uiThread = new Thread(new Runnable() {

              @Override
           public void run() {

    uiHandler.postDelayed(new Runnable() {

              @Override
          public void run() {

              yourUIAction();

              Toast.makeText(
                  ActivityContext.this,
                  R.string.finish_message,
                  Toast.LENGTH_SHORT).show();                        

                            }
                          }, 100);
                  }
                });
     uiThread.start();

Upvotes: 2

Usama Sarwar
Usama Sarwar

Reputation: 9020

Using Async Task is much better idea to me, when you have to do something in background, while progress dialog shows up on screen and then when background task completes, update UI... for reference please follow the link...

http://labs.makemachine.net/2010/05/android-asynctask-example/

hope this helps...:-)

Upvotes: 0

bwoogie
bwoogie

Reputation: 4427

You need to use a handler to be able to talk to the UI thread

//in some thread
uiHandler.sendEmptyMessage(1);

...
Handler uiHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 1) {
                //do somestuff
            }
        }
    };

Upvotes: 0

Related Questions