2012-04-22 72 views
1

我是新開發的Android和Java,並想知道如果有人能幫助我用下面的:傳遞字符串到活動

我創建一個運行服務器線程監聽特定端口上的應用程序。我想將從連接的客戶端收到的消息打印到活動中的TextView中。

服務器線程位於單獨的類中。此類中的run方法偵聽客戶端連接,並將接收到的任何數據讀取到String中。

對於我將此String的內容傳回活動以便它可以更新TextView的最佳方式是什麼?

從我(有限)的理解,只有ui線程應該更新TextView,我找不到一種方法來獲取runOnUiThread來更新TextView。

根據要求添加代碼。

活動代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView messages = (TextView) findViewById(R.id.messages); 

    try { 
     newThread server = new newThread(this, messages); 
    } catch(Exception e) { 
     Toast.makeText(ChatActivity.this, e.toString(), Toast.LENGTH_LONG).show(); 
    } 

} 

在newThread類Run方法:

public void run() 
{ 
    serv = new ServerSocket(8000); 
    while(true) 
    { 
     cli = serv.accept(); 
     user = cli.getInetAddress().toString(); 
     BufferedReader cli_in = new BufferedReader(new InputStreamReader(cli.getInputStream())); 
     OutputStreamWriter cli_out = new OutputStreamWriter(cli.getOutputStream()); 

     while((buf = cli_in.readLine()) != null) 
     { 
      // Update the messages TextView with buf 
     } 

    } 
} 

爲了避免使事情變得過於雜亂我已經遺漏了什麼無關的代碼,我可以。

基本上,在run()中的inner while循環中,我想將「buf」字符串傳遞給活動,以便可以使用它的內容更新消息textview。

乾杯

+0

你可以添加一些你的代碼嗎?這樣我們可以幫助你更好的... – amp 2012-04-22 14:34:59

回答

0

也許一個壞主意,但如何使用AsyncTask?沒有嘗試,如果這會工作,但它可能會,因爲onProgressUpdate有權訪問UI線程。

private TextView messages; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    messages = (TextView) findViewById(R.id.messages); 

    ReceiveTask receive = new ReceiveTask(); 
    receive.execute(100) 
    } 
private void updateTextView(String text) 
    { 
      messages.setText(text); 
    } 
    private class ReceiveTask extends AsyncTask<Integer, String, Long> { 

    @Override 
    protected void onPreExecute() { 

    } 

    protected Long doInBackground(Integer... urls) { 
     newThread nt = new newThread(); 
     while(true) 
     { 
      publishProgress(run()); 
     } 
     return (long)0; 
    } 

    protected void onProgressUpdate(String... value) { 
     updateTextView(value[0]); //method in Activity class, to update TextView 
    } 

    protected void onPostExecute(Long result) { 

     } 
    } 

基本上publishProgress將數據發送到onProgressUpdate,那麼這將在主類和更新的TextView將數據發送到方法(updateTextView)。

通常,如果您告訴正在進行聊天的人,這會有所幫助。此外,run()需要被修改,返回字符串,並從中刪除while(true)循環。這不是最好的主意,我建議你先閱讀一些關於如何進行Android聊天的教程。

+0

感謝您的迴應。我試圖實現這一點,但我看不到如何將字符串傳遞給publishProgress。我錯過了什麼嗎? – synic 2012-04-22 17:23:17

+0

已更新。我希望這會有所幫助,但我不確定這是否是一種好的做法。 – 2012-04-23 05:05:35