2012-01-07 78 views
4

這裏是我的代碼,進度對話框使用與主題

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. 

編輯:

ShowManager()是一個更改視圖元素的函數。有點像,

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

    } 

回答

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

這是因爲你正試圖從線程中消除對話框,而它是在主UI線程中創建的。嘗試在線程內移動ProgressDialog.show聲明。我寧願使用的AsyncTask,因爲它們更易於管理在本example

+0

progressdialog正在工作,我收到錯誤的行,我打電話給showmanager()。 – ocanal 2012-01-08 00:03:03

+0

所以發佈showmanager的代碼 – nandeesh 2012-01-08 00:05:12

+1

@nandeesh我編輯了它。 – ocanal 2012-01-08 00:13:26

4

使用這個,而不是僅僅loadingdialog.dismiss()

runOnUiThread(new Runnable() { 

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

我對顯示和解除progressdialog沒有任何問題,這是工作,我得到showmanager()函數的錯誤。 – ocanal 2012-01-08 00:01:36

+0

所以,而不是在上面的答案加載dialog.dismiss放showmanager(),應該工作 – nandeesh 2012-01-08 00:19:21

0

像這樣它的「OK」:

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