2012-02-28 3 views
3

У меня уже есть идея о том, как использовать диалоговое окно прогресса при выполнении фонового действия. Но мой вопрос в том, как показать диалог прогресса, когда я динамически раздуваю огромный макет.Показать прогресс Диалог при настройке пользовательского интерфейса

Поскольку я не могу раздуть представление в другой теме, я использую основной поток пользовательского интерфейса. Из-за этого мой диалог прогресса не получает приоритет, и он не появляется. Мой пользовательский интерфейс зависает в течение нескольких секунд, пока он не загрузится полностью. Я попробовал несколько утверждений, но никто не работает.

 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. 

Я в основном ищу динамические изменения макета, основанные на действиях пользователя. Поэтому у меня нет другого способа, кроме создания динамических представлений. Может ли кто-нибудь предложить мне полезную идею.

+0

Пожалуйста, вы можете разместить setNewContent метод – user936414

ответ

0

Вы должны использовать обработчик, чтобы иметь возможность говорить с UI нити

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

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

Я знаю, что могу использовать обработчики. И я использовал hanlders для обновления интерфейса. Но в это время прогрессDialog просто зависает. Он больше не вращается, чтобы сделать его более неприятным –

+0

, поэтому, если вы поместите свой прогрессDialog в новый поток и запустите его, а вызов обработчика для раздувания вашего макета не должен работать? – bwoogie

+0

Я пробовал, и колесо прогресса не вращается, если я попробую это таким образом. –

0

используется асинхронная задача гораздо лучшая идея для меня, когда вы должны сделать что-то в фоновом режиме, в то время как диалог прогресса показывает вверх на экране, а затем, когда завершается фоновая задача, обновление пользовательского интерфейса ... для справки, пожалуйста, пройдите по ссылке ...

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

надеюсь, что это помогает ... :-)

+3

Пожалуйста, внимательно прочитайте вопрос. Я не делаю фоновых действий. Я использую основной поток пользовательского интерфейса для обновления интерфейса. Я не могу использовать фоновый поток для этого. –

+0

Ну, вы можете использовать ту же идею ... Надуйте UI в BG и покажите spinner спереди, когда функция раздувания заканчивается, удалите счетчик. –

2

У меня была аналогичная проблема с ui-thread. Я хотел добавить много просмотров в мой макет во время выполнения, я хотел показать ProgressDialog, чтобы сообщить пользователю, что это может занять некоторое время. Я попробовал это с помощью AsyncTask, но единственный шанс сделать это - реализовать мои ui-методы в onPostExecute-Method AsyncTask. Но это просто замораживает ProgressDialog, потому что ProgressDialog даже работает на ui-thread. Я нашел решение, может быть, не самое лучшее, но оно работает. Перед запуском ui-action я показываю Toast. Затем я создал Thread с обработчиком и отложил выполнение. После того, как было сделано действие, я показал новый тост. Задержка нить, дает Toast достаточно времени, чтобы показали:

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();