在 android 工作室中使用 AsyncTask 从套接字读取数据

Reading data from socket using AsyncTask in android studio

您好,我目前正在 android 工作室为一个学校项目开发消息传递应用程序。

我正在使用套接字让客户端与服务器通信,我知道您不应该在 UI 线程中调用网络方法,因此为了解决这个问题,我正在使用 asynctask 我已经创建了 asynctask classes 创建一个套接字,然后通过它发送数据,但我在恢复数据时遇到了麻烦,因为我正在努力寻找一种方法将数据从 asynctask 中取出并返回到 UI 线程。

我尝试使用 onpostexecute 在 class 中设置一个全局变量,我正在使用套接字相关方法(和 asynctask classes),然后使用 getter 方法在 UI 线程中读取它,但是 UI 线程要快速读取它,然后才能设置它,我不想设置计时器来使 UI 线程等待设置此变量,因为这违背了首先使用 asynctask 的要点。

我希望这里有人能指出正确的方向,如何做到这一点,使用 asynctask 只是错误的方式吗?如果是这样,我应该如何在 android.

中实现套接字

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

旁注:我正在使用数据输入流和 .readUTF 通过套接字接收数据。

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

您正在使用 DataInputStream 通过其 readUTF 方法从您的套接字中检索数据。 readUTF 方法 return 是一个字符串。我不确定您要将什么数据传递给套接字以启动 request/response 操作,但无论该数据类型是什么,您都需要用它覆盖 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();
}

return 类型是一个字符串,因为它是由 readUTF 方法 return 编辑的数据,因此我假设您想要一个字符串 return 编辑到 UI线程。

接下来需要重写onPostExecute方法如下

@Override
protected void onPostExecute(String result) {
    // do whatever needs to be done on the UI thread with the result
}

您的子classed AsyncTasks 将被定义为

class SocketTask extends AsyncTask<String, Void, String> {
...
}