Использование диалога прогресса с потоком - PullRequest
3 голосов
/ 08 января 2012

вот мой код,

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 ]

13 голосов
/ 08 января 2012

Я нашел ответ.Я не люблю отвечать на свой вопрос, но, возможно, , это поможет кому-то еще.Мы не можем обновить большинство объектов пользовательского интерфейса в отдельном потоке.Мы должны создать обработчик и обновить представление внутри него.

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();
4 голосов
/ 08 января 2012

используйте это вместо просто loadingdialog.dismiss ()

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         loadingdialog.dismiss();
    }
});
0 голосов
/ 08 января 2012

что-то вроде этого, все в порядке:

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

0 голосов
/ 08 января 2012

Это потому, что вы пытаетесь закрыть диалог из потока, когда он был создан в основном потоке пользовательского интерфейса. Попробуйте переместить оператор ProgressDialog.show внутри потока. Я бы предпочел использовать AsyncTask, так как ими намного проще управлять, как в этом примере

...