Thread的进度对话框用法

时间:2012-01-07 23:15:22

标签: android dialog progressdialog

这是我的代码,

public ProgressDialog loadingdialog;
public void ShowManager() {
    //do something
}
public void startScan() {
      loadingdialog = ProgressDialog.show(WifiManagementActivity.this,
                                              "","Scanning Please Wait",true);
      new Thread() {
          public void run() {
              try {
                    sleep(4000);
                    ShowManager();

              } catch(Exception e) {
                    Log.e("threadmessage",e.getMessage());
              }
              loadingdialog.dismiss();
          }
      }.start();
    }

startScan();

一个基本的progressdialog show函数,但是在调用ShowManager()的行上,得到错误,

01-07 23:11:36.081: ERROR/threadmessage(576): Only the original thread 
that created a view hierarchy can touch its views.

修改

ShowManager()是一个更改视图元素的函数。不久之后,

  public void ShowManager() 
  {
      TextView mainText = (TextView) findViewById(R.id.wifiText);
      mainText.setText("editted");

  }

4 个答案:

答案 0 :(得分:13)

我找到了答案。我不想回答我自己的问题,但也许this会帮助其他人。在单独的线程中,我们无法更新大多数UI对象。我们必须创建一个处理程序并更新其中的视图。

public ProgressDialog loadingdialog;
  private Handler handler = new Handler() {
          @Override
              public void handleMessage(Message msg) {
              loadingdialog.dismiss();
              ShowManager();

          }
      };
  public void ShowManager()
  {
      TextView mainText = (TextView) findViewById(R.id.wifiText);
      mainText.setText("editted");
  }
  public void startScan() {
      loadingdialog = ProgressDialog.show(WifiManagementActivity.this,
                                          "","Scanning Please Wait",true);
      new Thread() {
          public void run() {
              try {
                  sleep(4000);
                  handler.sendEmptyMessage(0);

              } catch(Exception e) {
                  Log.e("threadmessage",e.getMessage());
              }
          }
      }.start();
  }

  startScan();

答案 1 :(得分:4)

使用它而不仅仅是loadingdialog.dismiss()

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         loadingdialog.dismiss();
    }
});

答案 2 :(得分:0)

这是因为在主UI空间中创建对话框时,您试图从该线程中删除该对话框。尝试在Thread中移动ProgressDialog.show语句。我更喜欢使用AsyncTask,因为它们比example

更容易管理

答案 3 :(得分:0)

类似这样的'好':

public void startScan() {
  new Thread() {
      public void run() {
  loadingdialog = ProgressDialog.show(WifiManagementActivity.this,
                                          "","Scanning Please Wait",true);
          try {
                sleep(4000);
                ShowManager();

          } catch(Exception e) {
                Log.e("threadmessage",e.getMessage());
          }
          loadingdialog.dismiss();
      }
  }.start();
}

注意ProgressDialog.show(...)的位置,这里在创建对话框的线程中调用dialog.dismiss()。 但是通过使用AsynTask

获得最简洁的方法