Это обработчик в главной теме, который показывает и отклоняет диалог прогресса.Диалог прогресса 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());
Но это не помогает, она возвращает истину, даже если диалог еще не показывает.
Спасибо, я займусь использованием петлителя. :::: AsyncTask был примером, где обработчик выполняет так, как ожидалось. Я не запускаю runOnUiThread в AsyncTask. Runnable связан с другим кодом в приложении, где мне нужно представить тот же ProgressDialog, там я использую runOnUiThread. – ilomambo