Java 在android studio中使用AsyncTask从套接字读取数据

Java 在android studio中使用AsyncTask从套接字读取数据,java,android,sockets,android-asynctask,Java,Android,Sockets,Android Asynctask,嗨,我目前正在android studio中为一个学校项目开发一个消息应用程序 我使用套接字让客户端与服务器通信,我知道你不应该在UI线程中调用网络方法,所以为了解决这个问题,我使用asynctask我创建了asynctask类来创建一个套接字,然后通过它发送数据,但是我在恢复数据方面遇到了困难,因为我正在努力找到一种方法,将数据从asynctask中取出并返回UI线程 我已尝试使用onpostexecute在用于套接字相关方法(和asynctask类)的类中设置全局变量然后在UI线程中使用ge

嗨,我目前正在android studio中为一个学校项目开发一个消息应用程序

我使用套接字让客户端与服务器通信,我知道你不应该在UI线程中调用网络方法,所以为了解决这个问题,我使用asynctask我创建了asynctask类来创建一个套接字,然后通过它发送数据,但是我在恢复数据方面遇到了困难,因为我正在努力找到一种方法,将数据从asynctask中取出并返回UI线程

我已尝试使用onpostexecute在用于套接字相关方法(和asynctask类)的类中设置全局变量然后在UI线程中使用getter方法从中读取,但UI线程需要快速读取,然后才能进行设置,我不想设置计时器使UI线程等待设置此变量,因为这首先会破坏使用asynctask的目的

我希望这里有人能给我指出正确的方向,如何做到这一点,使用asynctask是否就是错误的方式呢?如果是这样,我应该如何在android中实现套接字

感谢您的阅读我感谢您的时间:)


旁注:我使用datainputstream和.readUTF通过套接字接收数据。

AsyncTask类对您的问题有两种重要的方法,doInBackground(Params…onPostExecute(Result)

您正在使用DataInputStream使用其readUTF方法从套接字检索数据。readUTF方法返回一个字符串。我不确定您要传递到套接字以启动请求/响应操作的数据是什么,但无论该数据类型是什么,您都需要用它重写doInBackground方法。例如,假设您正在使用套接字向服务器传递一个数据字符串。您的doInBackground方法看起来像

@Override
protected String doInBackground(String... data) {
    /* set up the socket/DataInputStream, etc. and whatever else you need
       in the background */ 
    DataInputStream in = ...;
    return in.readUTF();
}
返回类型是字符串,因为这是readUTF方法返回的数据,因此我假设您希望将字符串返回到UI线程

接下来,您需要重写onPostExecute方法,如下所示

@Override
protected void onPostExecute(String result) {
    // do whatever needs to be done on the UI thread with the result
}
您的子类AsyncTasks将定义为

class SocketTask extends AsyncTask<String, Void, String> {
...
}
class SocketTask扩展了异步任务{
...
}

大家好,欢迎来到stackoverflow,请查看这篇关于提问的文章,然后通过添加代码编辑您的问题。
使用onpostexecute设置全局变量
。不要那样做。您应该在onPostExecute()中对接收到的数据执行所有工作。只需调用已有的函数。或者,如果没有单独的函数,则将相关代码放入函数中,并在onPostExecute()中调用这些函数。你的问题还可以。确实不需要发布代码。可以从doInBackground()调用不接触ui的代码。