Показать диалоги прогресса, пока пользовательский интерфейс настраивается - PullRequest
3 голосов
/ 28 февраля 2012

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

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

        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.

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

Ответы [ 3 ]

2 голосов
/ 01 ноября 2012

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

    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();
0 голосов
/ 28 февраля 2012

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

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

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

0 голосов
/ 28 февраля 2012

Вам нужно использовать обработчик, чтобы иметь возможность общаться с потоком пользовательского интерфейса

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

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