在 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> {
...
}
您好,我目前正在 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> {
...
}