我是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。
干杯
答案 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聊天的教程。