Android:收到以下错误“只有创建视图层次结构的原始线程才能触及其视图。”

时间:2014-10-05 14:39:48

标签: android multithreading progressdialog looper

以下是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();

任何帮助都将不胜感激 感谢。

1 个答案:

答案 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上。分离这两项任务将使您的应用程序响应更快,更易于维护。