java - 简单的 android tcp 应用程序不会更新主线程
问题描述
我想为 Android 构建一个简单的 tcp 客户端。客户端需要首先发送名称和密码,然后保持与服务器的连接,直到应用程序关闭(如果我们由于某种原因失去连接,我们需要通过发送用户和密码重新建立连接)。
现在我实现了一些这样的简单客户端:
public class SendRecvAsynch extends AsyncTask<String, String, TcpClient> {
final String SERVER_IP = "10.0.0.7"; //server IP address
final int SERVER_PORT = 1234;
String modifiedSentence;
EditText tv = (EditText) findViewById(R.id.editText_main);
@Override
protected TcpClient doInBackground(String... message) {
//we create a TCPClient object
try {
// create address
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
try {
//create a socket to make the connection with the server
Socket socket = new Socket(serverAddr, SERVER_PORT);
// create in out stream
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// write to server and get response
outToServer.writeBytes("hello from client");
// read from server
modifiedSentence = inFromServer.readLine();
if (modifiedSentence == null)
{
modifiedSentence = "didn't get a dame thing from the server";
}
// close the socket
socket.close();
}catch (IOException e) {
tv.setText(e.toString());
e.printStackTrace();
}
} catch (UnknownHostException e) {
tv.setText("got exceptin");
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tv.setText(modifiedSentence);
//response received from server
Log.d("test", "response " + values[0]);
//process server response here....
}
}
我从OnCreate
这样的方法启动客户端:
new SendRecvAsynch().execute("");
我希望该应用程序将连接服务器,向他发送“来自客户端的问候”,等待服务器响应并关闭套接字连接。
在我得到回复后,我想AsyncTask
更新EditText
我在主应用程序屏幕上的一个框。
问题是这AsyncTask
不会更新EditText
......我在服务器端看到应用程序已连接并向服务器发送“来自客户端的问候”,但我没有从客户端看到服务器响应......
我想由于某种原因后台进程无法访问属于主线程的主屏幕,我该如何更改它?如何创建从服务器发送和接收线路的简单 tcp 客户端?
谢谢你。
解决方案
EditText
是的,您是对的,在 android 中,禁止在主线程之外访问更新 UI(在您的情况下)。
但出于这个原因AsyncTask
,有onPostExecute()
一种方法可以让您直接从主线程运行代码。
因此,您唯一需要做的就是覆盖和实施onPostExecute()
以SendRecvAsynch
满足您的需求。
推荐阅读
- javascript - 将行项目从一个表移动到另一个表,并在将选定行项目添加到第二个表之前验证在第一个表中输入的数据
- c# - c#语言的功率限制是多少
- java - 使用与我的本地主机相同的配置运行 dropwizard,在 vps 上出现错误
- python-3.x - 老板大战迷你游戏。如何让boss血量一直降到0
- r - 如何将矩阵中的特定字符数存储到R中的另一个向量中
- android - 如何增加 Vector Drawable 的大小?
- php - 如何在php中正确转义电子邮件标头
- speech-recognition - Kaldi:qsub 的输出是:qsub:在尝试运行 Common Voice 配方时非法 -c 值“”
- python-3.x - 我尝试使用 chromedriver 或 geckodriver 在 python 上打开 chrome 或 firefox,但打开了任何页面
- swift - UITableViewCell .Xib 文件中的 IBOutlet Nil