2012-06-07 3 views
1

Это обработчик в главной теме, который показывает и отклоняет диалог прогресса.Диалог прогресса Android не отображается

public static final int SHOW = 0; 
public static final int DISMISS = 1; 
public Handler pdHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     Log.i(TAG, "+ handleMessage(msg:" + msg + ")"); 
     switch(msg.what) { 
     case SHOW: 
      pd = ProgressDialog.show(LogViewer.this, "", getText(R.string.loading_msg), true); 
      break; 
     case DISMISS: 
      if(pd != null) { 
       pd.dismiss(); 
       pd = null; 
      } 
      break; 
     } 
    } 
}; 

сообщение, чтобы показать прогресс является:

 pdHandler.sendMessage(pdHandler.obtainMessage(SHOW)); 

Сообщение отклонить это:

 pdHandler.sendMessage(pdHandler.obtainMessage(DISMISS)); 

Это хорошо работает, когда я называю его, прежде чем я начать AsyncTask, то AsyncTask onPostExecute() отклоняет его.

Но когда он запускается в runnable (runOnUiThread), диалог не отображается. Изучая переменную pd нана отладчике, она показывает, что она создана, она запущена и она видна, но на практике она не видна.

Любое предложение?

UPDATE:
Я сделал очевидный тест, который я должен был сделать в первую очередь. Я прокомментировал сообщение DISMISS. И диалог прогресса появился. Оказалось, что слишком поздно, после того, как побег был закончен.
Теперь я понял, что сообщение DISMISS отклонило еще не видимый ProgressDialog, поэтому я его не видел.
Теперь вопрос: мне нужно, чтобы ProgressDialog отображался до запуска исполняемого кода. И это не так прямо. Моя иерархия вызовов, как это:

onScrollEventChanged 
    --> runOnUiThread ( 
     --> checkScrollLimits 
      --> if need to scroll 
       show ProgressDialog "Loading" 
       get new data into table 
       dismiss ProgressDIalog 
    ) 

Я пытался что-то вроде этого:

onScrollEventChanged 
    --> checkScrollLimits 
     --> if need to scroll 
      show ProgressDialog "Loading" 
      --> runOnUiThread ( 
       get new data into table 
       dismiss ProgressDIalog 
      ) 

Но все-таки получил там сообщение уволить до ProgressDialog может показать.

Согласно Logcat, существует 5-секундный интервал между приходом сообщения SHOW и приходом сообщения DISMISS.

UPDATE II:
я, хотя я буду использовать метод isShowing() из ProgressDIalog

pd = ProgressDialog.show(...) 
while(!pd.isShowing()); 

Но это не помогает, она возвращает истину, даже если диалог еще не показывает.

ответ

0

Я запустил его, превратив код в AsyncTask и используя блоки try/catch.

Смотрите мой ответ в this post

Я не уверен, что если AsyncTask необходимо, но после того как я его, /поймать блок попробовать сделал разницу.

2

Может быть, вы не должны использовать runOnUiThread() и лучше справиться с этим с помощью функции Looper.prepare():

What is the purpose of Looper and how to use it?

Кроме того ваш AsyncTask закончена и работает в onPostExecute(), то вы находитесь в UI-потоке, поэтому дополнительный runOnUiThread() является не обязательно.

+0

Спасибо, я займусь использованием петлителя. :::: AsyncTask был примером, где обработчик выполняет так, как ожидалось. Я не запускаю runOnUiThread в AsyncTask. Runnable связан с другим кодом в приложении, где мне нужно представить тот же ProgressDialog, там я использую runOnUiThread. – ilomambo

0

Я думаю, что не будет work.The места, откуда вы отправляете сообщение

pdHandler.sendMessage (pdHandler.obtainMessage (DISMISS));

вам нужно положить все эти тяжелые заявления или работать в другую нить ui. Обработчик используется, чтобы поместить сообщение в очередь сообщений Thread, если ваш поток будет занят, тогда он выполнит это сообщение после предыдущего messsage. Поэтому из-за вашей тяжелой работы в этом диалоговом окне не обновляется. Всегда пользуйтесь услугами для работы в фоновом режиме. Никогда не пытайтесь помещать все в свой поток пользовательского интерфейса.

Надеюсь, что это поможет вам в противном случае использовать AsyncTask, это лучший способ делать такие вещи. Если вы все еще сталкиваетесь с одной и той же проблемой, отправьте этот код с того места, где вы отправляете сообщение обработчику.

Смежные вопросы