3

アクティビティでは、時間がかかるリストビューの行をロードするため、このタスクを別のスレッドに配置して、progressDialogを表示できるようにします。

私は次のことをします

private void doMyStuff() {
    listItems.clear();
    progressDialog.show();

    new Thread(new Runnable() {
        @Override
        public void run() {                
            for () {
                listItems.add(something to add);
            }
        handler.sendEmptyMessage(0);
        progressDialog.dismiss();
        }
    }).start();
}

private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if (msg.what == 0) {
            adapter.notifyDataSetChanged();
        }
    };
};

IllegalStateExceptionを発生させるバグが時々あります。まず第一に、私は驚きました。なぜなら、そのようなプログラミングスレッドは、私が通常標準のJavaプログラムで行うことだからです。

このバグは「時々」しか発生せず、段階的なデバッグを行っているときには発生しません。

これは私をウェブの周りで検索するように導きました、そして私はこれに関連するいくつかの質問をSOで見つけました、そして私は物事が私の心にはっきりしていないことを認めなければなりません。

スレッドが終了したときにのみnotifyDataSetChanged()を呼び出すので、なぜ例外が発生することがありますか。

誰かが私にこのやり方が間違っていること、そして私が非同期タスクを使用しなければならないこと、そしておそらく私に理由を説明しなければならないことを確認できますか?

progressDialogを表示する必要があります。誰かが、リストビューにデータを入力し、入力中の進行状況のprogressDialogを表示するAsyncTaskの簡単な例を教えてください。

ありがとう

アップデート

jtanveerは私にasynctaskの質問に対する答えをくれました。今、他の人たちは、却下がハンドラーにないことを指摘しましたが、私はそれを訂正します。

「痛みのない糸脱毛」に関するjtanveerの記事によると、彼らは次のように述べています。

Androidには、HANDLERである他のスレッドからUIスレッドにアクセスするためのいくつかの方法が用意されています。

解雇されたものをハンドラーに入れても問題が解決しなかった理由を誰かが知っていますか?私にとってlistItem.addはUIとは何の関係もありませんか?その点で私は間違っていますか?

私の場合、私のコードでは、UIはアダプターとprogressdialogだけですか?解説や説明は大歓迎です。

最終回答

stjomは、私の特定のコードに対して実用的な答えを出しました。ハンドラーでrunOnUiThreadを実行します。動作していますが、ハンドラーがUiスレッドで実行されていると思ったので驚いています...

すべての回答に感謝します。

4

3 に答える 3

3

以下のように内部クラスを定義します。

private class LoadListTask extends AsyncTask<String, Void, Integer> {
    protected void onPreExecute() {
        progressDialog.show();
    }

    protected Integer doInBackground(String... params) {
        for () {
            listItems.add(something to add);
        }
        return 0;
    }

    protected void onPostExecute(Integer result) {
        progressDialog.dismiss();
        if (result == 0) {
           adapter.notifyDataSetChanged();
        }
    }
}

必要に応じて、この記事を参照してください。

于 2012-05-04T20:26:53.270 に答える
2

AsyncTaskを使用する必要はありません。これは便利なだけです。

現在の実装が時々機能しない理由については、進行状況ダイアログをUIスレッドから閉じる必要があります。これにより、バックグラウンドスレッドではなく、ハンドラーに移動する必要があります。

于 2012-05-04T22:10:45.577 に答える
2

呼び出すたびadapter.notifyDataSetChanged();に、オブジェクトへの変更が識別されますlistItems。変更が見つかった場合は、それに応じてUIが更新されるため、問題が発生すると思います。あなたは呼び出すことができます

runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }  
});

ハンドラー内。

于 2012-05-09T01:50:36.000 に答える