2012-01-11 3 views
0

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

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

+0

похоже, что вы понятия не имеете, что вы делаете ... почему вы используете 'runOnUiThread' в' doInBackground'? ... теперь ваш поток кода похож: я запускаю новый поток (AsyncTask), чтобы запустить задание обратно на поток ui (runOnUiThread) – Selvin

+0

, что происходит, когда вы выполняете вызов ProgressDialog.show (...), прежде чем вы будете вызывать новый MyAsyncTask () .execute() и сохранить окончательную ссылку (в диалоговом окне прогресса) внутри исходного кода? – bgs

ответ

1

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

5

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

runOnUiThread (новый Runnable() {

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

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

Полезное руководство asyntask можно найти здесь.

2

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

  1. Начало нового не-UI нить
  2. С этой новой, не Ui нити вы вывесили длинную выполняемую задачу для UI потока.
  3. Выход из не-ui нити.
  4. Ваша нить ui теперь выполняет долговременную работу (RefreshDataBase) и блокирует пользовательский интерфейс.

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

+0

Я попытался вызвать 'RefreshDataBase' напрямую, но он разбился с помощью:' Caused by: java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() '. Что вы имеете в виду, мне нужно его реорганизовать? – AlexAndro

+0

Это потому, что он использует что-то, что должно запускаться в потоке пользовательского интерфейса (или, по крайней мере, в потоке Looper). – inazaruk