2012-01-07 4 views
4

вот мой код,использование Прогресс Диалог с Thread

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 шоу функция, но на линии, где ShowManager() вызывается, получая ошибки,

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

EDIT:

ShowManager() - это функция, которая меняет элементы представления. в ближайшее время что-то вроде,

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

    } 

ответ

13

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

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(); 
0

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

+0

progressdialog работает, я получаю ошибку на линии, где я назвал showmanager(). – ocanal

+0

поэтому отправьте код showmanager – nandeesh

+1

@nandeesh Я его отредактировал. – ocanal

4

используют это вместо того, чтобы просто loadingdialog.dismiss()

runOnUiThread(new Runnable() { 

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

У меня нет проблем с отображением и увольнением progressdialog, это работает, я получаю ошибку в функции showmanager(). – ocanal

+0

так вместо загрузкиdialog.dismiss put showmanager() в вышеприведенном ответе, который должен работать – nandeesh

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

 Смежные вопросы

  • Нет связанных вопросов^_^