将字符串传递给Activity

时间:2012-04-22 14:17:27

标签: android

我是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类中运行方法:

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()的内部while循环中,我想将“buf”字符串传递给活动,以便可以使用它的内容更新消息textview。

干杯

1 个答案:

答案 0 :(得分: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,然后将数据发送到主类中的方法(updateTextView)并更新TextView。

通常,如果您告诉别人您正在聊天,这会有所帮助。此外,需要修改run(),返回字符串,并从中删除while(true)循环。这不是最好的主意,我建议你先阅读一些有关如何进行Android聊天的教程。