2012-12-27 26 views
1

當我想的setText到一個TextView,該應用程序強制關閉,並給了我這個錯誤:誤差的setText:「只有原來的線程..可以觸摸的意見」

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

這是一部分我的代碼:

Thread ThreadRecording = new Thread(new Runnable() { 
    public void run() { 
     while(recorder) 
     { 
      if (body_num = 10) 
      { 
       TextView loog = (TextView)findViewById(R.id.textView1); 
       loog.setText("Total : 10, Thank you"); 
      } 
     } 
    } 
}); 
ThreadRecording.start(); 

有一個按鈕;如果用戶點擊它,它調用一個函數來設置body_num = body_num + 1,如果body_num ==線程檢查10

+0

這裏http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-c​​reated-a-view-hierarchy-can-touch-its-vi – Androyds

+0

(重複/解決方案將已經被發現,如果只是尋找錯誤消息。 ) – 2012-12-27 01:54:47

+0

注意事項:1 - 'ThreadRecording'是類Thread的一個實例,因此它的名字應該以小寫字母IE threadRecording開頭。 2 - 你可以跳過聲明'Thread',而是隻有'new Thread(new Rubbable(){/ * contents ... * /}).start();' – ArtOfWarfare

回答

3

Only the original thread that created a view hierarchy can touch its views

因爲只有用戶界面(主)線程,你是否能夠操縱視圖。您可以使用Hanlder更新您的觀點。

有一個處理程序兩種主要用途:作爲在將來的某一時刻將被執行

  1. 要調度消息和可運行;和
  2. 排隊要在不同於自己的線程上執行的操作。爲應用程序創建一個進程時,其主線程專門用於運行消息隊列,該消息隊列負責管理頂級應用程序對象(活動,廣播接收器等)以及它們創建的任何窗口。您可以創建自己的線程,並通過Handler與主應用程序線程進行通信。這是通過像以前一樣調用相同的post或sendMessage方法來完成的,但是通過您的新線程來完成。給定的可運行或消息然後將在處理程序的消息隊列被調度和處理在適當的時候「
    - 從‘developer.android.com’

例:

化背景線程:

new Thread() { 

public void run() { 
    while(recorder) 
     { 
      if (body_num = 10) 
      {     
       messageHandler.sendEmptyMessage(0); 
      } 
     } 
    } 

}.start(); 

你處理其放在主線程:

private Handler messageHandler = new Handler() { 

public void handleMessage(Message msg) { 
      //update your view here 
    } 
}; 
+0

這就是我想要的,謝謝! –

1

只能修改UI線程的意見,你需要使用處理程序,例如,

Handler h = new Handler(context.getMainLooper()) { 
    public void handleMessage(Message msg) { 
     TextView loog = (TextView)findViewById(R.id.textView1); 
     loog.setText(msg.obj); 
    } 
}; 

Thread ThreadRecording = new Thread(new Runnable() { 
    public void run() { 
     while(recorder) 
     { 
      if (body_num = 10) 
      { 
       Message message = new Message(); 
       message.obj = "Total : 10, Thank you"; 
       handler.sendMessage(message); 
      } 
     } 
    } 
}); 
ThreadRecording.start(); 
+0

這就是我想要,謝謝! –

相關問題