1

これは、進行状況ダイアログを表示および閉じる、メイン スレッド内のハンドラーです。

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 を返します。

4

3 に答える 3

2

たぶん、あなたはこれを使用するべきではなく、関数runOnUiThread()を介してこれをよりよく処理するべきですLooper.prepare()

Looperの目的と使用方法は何ですか?

さらに、AsyncTask終了して実行するonPostExecute()と、UIスレッドが表示されるため、追加runOnUiThread()する必要はありません。

于 2012-06-07T16:07:27.500 に答える
0

私はそれがうまくいかないと思います。あなたがメッセージを送信している場所

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

これらの重いステートメントをすべて配置するか、別の非UIスレッドに作業する必要があります。ハンドラーは、スレッドがビジー状態の場合にメッセージをスレッド メッセージ キューに入れるために使用され、前のメッセージの後にそのメッセージを実行します。そのため、UI の重い作業のために、ダイアログ ボックスが更新されていません。バックグラウンド作業には常にサービスを使用してください。UIスレッドだけにすべてを入れようとしないでください。

それ以外の場合は AsyncTask を使用するのに役立つことを願っています。これは、そのようなことを行うための最良の方法です。それでも同じ問題に直面している場合は、メッセージをハンドラーに送信している場所からそのコードを投稿してください。

于 2012-06-07T16:26:49.810 に答える
0

コードを AsyncTask に変換し、try/catch ブロックを使用して機能させました。

この投稿で私の答えを見てください

AsyncTask が必要かどうかはわかりませんが、取得した後、try/catch ブロックが違いを生みました。

于 2012-06-10T13:00:37.757 に答える