在 android studio 中使用 AsyncTask 从套接字读取数据
Posted
技术标签:
【中文标题】在 android studio 中使用 AsyncTask 从套接字读取数据【英文标题】:Reading data from socket using AsyncTask in android studio 【发布时间】:2020-03-22 02:30:30 【问题描述】:您好,我目前正在 android studio 中为一个学校项目开发一个消息传递应用程序。
我正在使用套接字让客户端与服务器通信,我知道您不应该在 UI 线程中调用网络方法,因此为了解决这个问题,我正在使用 asynctask 我创建了 asynctask 类来创建套接字,然后通过它发送数据,但我无法恢复数据,因为我正在努力寻找一种方法将数据从 asynctask 中取出并返回到 UI 线程。
我尝试使用 onpostexecute 在用于套接字相关方法(和 asynctask 类)的类中设置全局变量,然后使用 getter 方法在 UI 线程中读取它,但 UI 线程速度很快并在设置之前读取它,我不想设置一个计时器来让 UI 线程等待这个变量被设置,因为这首先破坏了使用 asynctask 的意义。
我希望这里的某个人可以为我指明如何做到这一点的正确方向,使用 asynctask 只是错误的方式吗?如果是这样,我应该如何在 android 中实现套接字。
感谢您的阅读,感谢您的宝贵时间:)
旁注:我正在使用 datainputstream 和 .readUTF 通过套接字接收数据。
【问题讨论】:
您好,欢迎来到***,请在***.com/help/how-to-ask查看这篇关于提问的文章,然后通过添加代码来编辑您的问题。using onpostexecute to set a global variable
。不要那样做。您应该对 onPostExecute() 中接收到的数据进行所有工作。只需调用您已经拥有的功能。或者,如果您没有单独的函数,则将相关代码放入函数中并在 onPostExecute() 中调用这些函数。你的问题没问题。确实不需要发布代码。不接触 ui 的代码可以从 doInBackground() 中调用。
【参考方案1】:
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();
返回类型是 String,因为这是 readUTF 方法返回的数据,因此我假设您希望将 String 返回给 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>
...
【讨论】:
以上是关于在 android studio 中使用 AsyncTask 从套接字读取数据的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:无法提取-Javascript Asyn问题
如何在模块(Android Studio)中使用 com.android.databinding?
怎样在Android Studio中使用Uiautomator