Java Android 将数据发送到服务器应用程序永远不要使用 onPostExecute()

问题描述 投票:0回答:3

我在向服务器发送数据时遇到问题,为了与服务器连接,我使用了套接字。为了将数据发送到服务器,我使用 AsyncTask。我有一个问题:

当应用程序发送数据时,我的应用程序看不到完成此操作,它从不使用

onPostExecute()

java android sockets android-asynctask
3个回答
1
投票

您可以使用

AsyncTask<Void,Void,Integer>
,并在 doInBackground 中返回任何整数而不是 null。

只需替换(在doInBackground)

return null;

return 1;

并替换(在 AsyncTask 声明中)

public class MyClientTask extends AsyncTask<Void, Void, Void> {

public class MyClientTask extends AsyncTask<Void, Void, Integer> {

1
投票

请注意,

getInputStream()
是一个阻塞调用。它将阻塞,直到从服务器接收到数据。在您的情况下,您在调用 getInputStream() 之前
将数据刷新到服务器,这将等待服务器的响应。现在您还没有向服务器发送任何数据(我想您应该在您的情况下获得响应),套接字将阻塞等待输入的线程。

您应该在获取输入流并使线程休眠之前刷新数据。完成后还要关闭所有流,因为关闭流将关闭底层套接字。来自文档:

关闭返回的 OutputStream 将关闭关联的套接字。

关闭返回的InputStream将关闭关联的套接字。

outputStream.flush(); // flush it before sleep and don't close
// outputStream.close(); don't close it here
 try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


                int bytesRead;
                InputStream inputStream = socket.getInputStream();

                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    byteArrayOutputStream.write(buffer, 0, bytesRead);
                    response += byteArrayOutputStream.toString("UTF-8");
                }
           

0
投票

您执行此行之后吗?

while ((bytesRead = inputStream.read(buffer)) != -1) {
                    byteArrayOutputStream.write(buffer, 0, bytesRead);
                    response += byteArrayOutputStream.toString("UTF-8");
                }

在 AsyncTask 中使用

URLConnection
代替套接字。

© www.soinside.com 2019 - 2024. All rights reserved.