ケース:アクティビティにボタンとリストビューがあります。ボタンをクリックすると、進行状況バーを更新する新しいスレッドを開始するクリック リスナーを追加しました。仕事が完了した後、つまりプログレスバーが 100% 完了したら、リストビューを更新したいと思います。
final OnClickListener mStartScan = new OnClickListener() {
@Override
public void onClick(View v) {
// prepare for a progress bar dialog
progressBar = new ProgressDialog(v.getContext());
progressBar.setCancelable(false);
progressBar.setMessage(getString(R.string.text_scanning_inbox));
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setProgress(0);
progressBar.setMax(totalSms);
progressBar.show();
progressBarStatus = 0;
Thread progressThread = new Thread(new Runnable() {
public void run() {
while (progressBarStatus < totalSms) {
// process some tasks
progressBarStatus = someStuff();
// Update the progress bar
progressBarHandler.post(new Runnable() {
public void run() {
progressBar.setProgress(progressBarStatus);
}
});
}
if (progressBarStatus >= done) {
// sleep 1 seconds, so that you can see the 100%
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// close the progress bar dialog
progressBar.dismiss();
// this method updates the list
populateList();
}
}
});
progressThread.start();
// try {
// progressThread.join();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// populateList();
// }
}
};
問題:タスクが完了してプログレス バーを閉じた後にリストビューを更新すると、ビューが作成されたスレッドからのみビューを更新できるという例外が発生します。
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
他に試したこと:プログレスバーを実行しているスレッドが完了するのを待ってから、メインスレッドからリストビューを更新しようとしました。
try {
progressThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
populateList();
}
ただし、これは機能しません。プログレスバーはまったく表示されません。