これは、進行状況ダイアログを表示および閉じる、メイン スレッド内のハンドラーです。
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() はそれを却下します。
ただし、ランナブル (runOnUiThread) 内で実行すると、ダイアログは表示されません。デバッガーで pd 変数を調べると、 is が作成され、実行中であり、表示されていることが示されていますが、実際には表示されていません。
なにか提案を?
更新:
最初に行うべきだった明らかなテストを行いました。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 によると、SHOW メッセージの到着と DISMISS メッセージの到着の間に 5 秒の間隔があります。
更新 II:
私は ProgressDIAlog の isShowing() メソッドを使用しますが
pd = ProgressDialog.show(...)
while(!pd.isShowing());
ダイアログがまだ表示されていなくても true を返します。