以下是Android中进度对话框的代码,我收到以下错误:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views
。我看到以前所有与此错误相关的帖子但我无法更正此错误。
// Waiting screen
pleaseWaitdialog = ProgressDialog.show(PhoneBookListView.this, "Loading", "Please wait...", true);
new Thread(new Runnable() {
@Override
public void run()
{
Looper.prepare();
// do the thing that takes a long time
LoadContactFromPhoneAndSim();
PhoneBookListView.this.runOnUiThread(new Runnable() {
@Override
public void run()
{
pleaseWaitdialog.dismiss();
}
});
}
}).start();
任何帮助都将不胜感激 感谢。
答案 0 :(得分:2)
我建议您使用AsyncTask,因为它们使这类事情变得更容易。通常,您希望在后台线程上执行复杂的操作,并且只从UI线程更新UI。
public class PhonebookLoader extends AsyncTask<Void,Void,Void> {
protected Void doInBackground(Void ... params) {
LoadContactFromPhoneAndSim();
return void;
}
protected void onPostExecute(Void param) {
pleaseWaitdialog.dismiss();
}
}
要使用此类启动它,只需调用它:
new PhonebookLoader.execute();
你可以用这个做各种各样的事情,比如发布你的进度以便用户知道他们已经取得了多大进展,在你完成加载后更新UI线程等等.AsyncTask是你的朋友,使用它。
看着这个,我怀疑PhonebookLoader可能正在加载数据并将其放在UI上。分离这两项任务将使您的应用程序响应更快,更易于维护。