首页 > 解决方案 > 简单的 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 客户端?

谢谢你。

标签: javaandroid

解决方案


EditText是的,您是对的,在 android 中,禁止在主线程之外访问更新 UI(在您的情况下)。

但出于这个原因AsyncTask,有onPostExecute()一种方法可以让您直接从主线程运行代码。

因此,您唯一需要做的就是覆盖和实施onPostExecute()SendRecvAsynch满足您的需求。


推荐阅读