2012-04-22 71 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