1

我是 Android 开发和 Java 的新手,想知道是否有人可以帮助我解决以下问题:

我创建了一个运行在指定端口上侦听的服务器线程的应用程序。我想将从连接的客户端收到的消息打印到活动中的 TextView 中。

服务器线程在一个单独的类中。此类中的 run 方法侦听客户端连接并将接收到的任何数据读取到 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”字符串传递给活动,以便可以使用其内容更新消息文本视图。

干杯

4

1 回答 1

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 聊天的教程。

于 2012-04-22T16:10:04.113 回答