ProgressDialog появляется слишком поздно и исчезает слишком быстро - PullRequest
0 голосов
/ 11 января 2012

Пока я обновляю свою базу данных, я хочу отобразить диалог прогресса.Моя проблема в том, что ProgressDialog начинает появляться позже, через 4-5 секунд, затем появляется и исчезает очень быстро, он остается на экране несколько миллисекунд, почти не видя его, затем новые данные сразу же отображаются в списке.Это заставляет меня думать, что ProgressDialog ожидает обновления базы данных (это не занимает много времени, около 4,5 секунд), а затем отображается на экране, но очень быстро исчезает.Я хотел бы, чтобы ProgressDialog появлялся немедленно, я нажимал кнопку «Обновить» и оставался на экране около 4-5 секунд.

class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        ProgressDialog myprogsdial;
        @Override
        protected void onPreExecute(){
            myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true);
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                        RefreshDataBase();

                    }
                });

            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            myprogsdial.dismiss();
        }

    }

Когда я звоню, new MyAsyncTask().execute();

Ответы [ 3 ]

6 голосов
/ 11 января 2012

Хорошо, я думаю, что это

runOnUiThread (new Runnable () {

вызывает такое поведение.

doInBackground () выполняет ваш код в новом потоке для основного потока пользовательского интерфейса. Затем вы помещаете код для выполнения в этом потоке обратно в основной, в результате чего диалоговое окно прогресса задерживается в конце, а затем в postExecute () оно немедленно закрывается.

Хороший учебник asyntask можно найти здесь.

2 голосов
/ 11 января 2012

Вы не должны использовать runOnUiThread. То, что вы в основном сделали, это:

  1. Запущена новая не-пользовательская тема
  2. Из этого нового не-пользовательского потока вы опубликовали долгосрочное задание в пользовательском интерфейсе.
  3. Выход из не-пользовательского потока.
  4. Ваш поток пользовательского интерфейса теперь выполняет длительную операцию (RefreshDataBase) и блокирует интерфейс.

Вам следует позвонить RefreshDataBase() напрямую. И если этот метод затрагивает пользовательский интерфейс, вы должны рефакторинг его.

1 голос
/ 12 января 2012

Я решил, используя этот ответ Владимира Иванова .Я разделил функциональность по внешнему виду.Я сохранил функциональность (загрузка новых данных) в doInBackground() и в onPostExecute() Я обновил список: получите новый адаптер с именами setListAdaper() и notifyDataSetChanged.Конечно, я ушел, используя runOnUiThread().Спасибо всем за подсказки.

...