2011-03-23 44 views
9

在我的OnCreate方法中,我創建了一個偵聽傳入消息的線程!從線程更新textView

In OnCreate() { 

//Some code 

myThread = new Thread() { 

      @Override 

      public void run() { 

       receiveMyMessages(); 

      } 
     }; 
myThread.start(); 

// Some code related to sending out by pressing button etc. 

} 

Then, receiveMyMessage() functions… 

Public void receiveMyMessage() 
{ 

//Receive the message and put it in String str; 

str = receivedAllTheMessage(); 

// << here I want to be able to update this str to a textView. But, How? 
} 

我檢查了this article但它沒有爲我工作,沒有運氣!

回答

19

Android應用程序中UI的任何更新都必須發生在UI線程中。如果您生成一個線程在後臺執行工作,則必須在觸摸View之前將結果編組回UI界面。您可以使用Handler類來執行編組:

public class TestActivity extends Activity { 
    // Handler gets created on the UI-thread 
    private Handler mHandler = new Handler(); 

    // This gets executed in a non-UI thread: 
    public void receiveMyMessage() { 
     final String str = receivedAllTheMessage(); 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       // This gets executed on the UI thread so it can safely modify Views 
       mTextView.setText(str); 
      } 
     }); 
} 

AsyncTask類簡化了很多適合你的細節,也未嘗你可以看看。例如,我相信它爲您提供了一個線程池,以幫助減輕您每次想要執行後臺工作時產生新線程的部分相關成本。

+0

大家好,謝謝,非常感謝您的寶貴時間。但沒有運氣!我正在嘗試重寫我的問題: - (與原始問題一起) 在線程中的OnCreate中調用了receiveMyMessage()!這意味着這個rec​​eiveMyMessage是在一個單獨的線程中。在這個線程中,我有一個while循環,那就是閱讀是否有任何消息! 公共無效receiveMessages(){ while循環(條件) { STR = receivedAllTheMessage(); //現在,在這裏我要tv.settext更新GUI元素...等等。在這個答案 } } – 2011-03-23 11:23:46

+1

**額外提示:**你可以跳過使用活動的創建單獨的處理程序處理器對象。 'handler = getWindow()。getDecorView()。getHandler();' – Kent 2013-04-11 22:57:13

+0

@Kent該提示可能會或可能不會工作,具體取決於您使用它的位置。我在互聯網上的其他地方發現了這個提示,並利用它,然後當我在程序中更改了某些內容時,它突然不再工作了。有關詳細信息,請參閱此處:http://codereview.stackexchange.com/a/114723/92925 – RenniePet 2015-12-22 07:10:40

0

Android支持使用處理程序和sendMessage(msg)的消息傳遞併發。 (也可以使用處理程序進行共享內存併發。)如果希望線程在應用程序死亡時死亡,則可以調用thread.setDaemon(true)。另一個技巧是隻有一個處理程序,並在消息處理程序中使用message.what和switch語句來路由消息。

CodeCode