嗨,我目前正在 Android Studio 中为一个学校项目开发消息传递应用程序。
我正在使用套接字让客户端与服务器通信,我知道您不应该在 UI 线程中调用网络方法,因此要解决此问题,我正在使用 asynctask 我已经创建了 asynctask 类来创建套接字,然后通过它发送数据,但我在恢复数据时遇到问题,因为我正在努力找到一种方法来将数据从 asynctask 中取出并返回到 UI 线程。
我尝试使用 onpostexecute 在我用于套接字相关方法(和 asynctask 类(的类中设置一个全局变量,然后使用 getter 方法在 UI 线程中读取它,但 UI 线程要快速读取它才能设置,我不想设置计时器来使 UI 线程等待设置此变量因为这首先违背了使用 AsyncTask 的意义。
我希望这里有人能为我指出如何做到这一点的正确方向,使用 asynctask 只是错误的方式吗? 如果是这样,我应该如何在 Android 中实现套接字。
感谢您的阅读,感谢您抽出宝贵时间:)
旁注:我正在使用数据输入流和.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
}
您的子类化异步任务将定义为
class SocketTask extends AsyncTask<String, Void, String> {
...
}