我在向服务器发送数据时遇到问题,为了与服务器连接,我使用了套接字。为了将数据发送到服务器,我使用 AsyncTask。我有一个问题:
当应用程序发送数据时,我的应用程序看不到完成此操作,它从不使用
onPostExecute()
。
您可以使用
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> {
请注意,
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");
}
您执行此行之后吗?
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
response += byteArrayOutputStream.toString("UTF-8");
}
在 AsyncTask 中使用
URLConnection
代替套接字。