アクティビティでは、時間がかかるリストビューの行をロードするため、このタスクを別のスレッドに配置して、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スレッドで実行されていると思ったので驚いています...
すべての回答に感謝します。