如何在 AsyncTask 类中添加更多方法?
Posted
技术标签:
【中文标题】如何在 AsyncTask 类中添加更多方法?【英文标题】:How to add more methods in AsyncTask class? 【发布时间】:2019-10-01 04:47:23 【问题描述】:我想通过 Java 套接字在我的 android 和服务器(在我的 PC 中)之间建立一些连接。简单来说就是通过本地网络发送字符串、整数等数据。
我读到了 AsyncTask 类。我在类的doInBackground()
方法中添加了我的socket连接代码(类名为RemoteClient
)。下面是通过socket连接和初始化连接的代码:
@Override
protected Void doInBackground(Void... arg0)
Log.i("Socket","Connecting to the remote server: " + host);
try
socket = new Socket(host,8025);
oos = new ObjectOutputStream(socket.getOutputStream());
catch(IOException ex)
ex.printStackTrace();
return null;
我只是想通过套接字向服务器创建一个方法sendInteger(int value)
。我已经完成了连接,它连接良好。
那么,我应该把sendInteger(int value)
方法放在哪里,我可以把方法和实现的方法一起放在RemoteClient
类中吗?
我想在单击按钮时调用sendInteger(int value)
方法。
谢谢你..
【问题讨论】:
【参考方案1】:是的,您可以将 sendInteger 放入您的 AsyncTask 中。我喜欢使用构造函数而不是 AsyncTask 参数,因为它更灵活。您可以将接口实现为回调,以在您的 UI 中接收服务器应答。 onPostExecute 将始终在 onBackground 执行后由系统调用。 onPostExecute 也在 UI 线程上运行,因此您不必处理返回到 UI 线程的问题,因为您的 AsyncTask 将在不同的线程上运行。
您的代码如下所示:
Fragmentclass or Activity:
private void onButtonClick()
...
RemoteClient rc = new RemoteClient(value, (response) ->
Log.d(response);
;
rc.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...
public class RemoteClient extends AsyncTask<Void, Void, Void>
private Callback callback;
private int intValue;
public RemoteClient(int intValue, Callback callback)
this.callback = callback;
this.intValue = intValue;
@Override
protected Void doInBackground(Void... arg0)
Log.i("Socket","Connecting to the remote server: " + host);
try
socket = new Socket(host,8025);
oos = new ObjectOutputStream(socket.getOutputStream());
sendInteger(intvalue);
catch(IOException ex)
ex.printStackTrace();
return null;
private void sendInteger(int value)
// send the integer
protected void onPostExecute(Void aVoid)
if (callback != null)
callback.response;
private interface Callback
void serverResponse(String value);
如果你想更灵活,你可以实现一个 NetworkManager 类,它只是启动你的异步任务。然后,您始终可以将字符串作为 JSON 传递给您的 AsyncTask。或者你只使用 AsyncTask 但我建议使用继承。
【讨论】:
感谢帮助,能不能像主类中的rc.sendInteger(value)
一样直接调用函数?因为我在 onCreate 方法中调用rc.execute()
来初始化连接,所以它会在启动时自动连接到服务器。谢谢
不,这很不方便,因为doInBackground执行后,任务将被杀死并收集垃圾。考虑一下我也提到的。将 NetworkManager 用作 Singleton,在那里建立连接并使用 GSON 将输入解析为 JSON,然后您不必处理不同的输入。你也可以使用改造!这是一个易于使用且来自 google 推荐的用于网络通信的库。以上是关于如何在 AsyncTask 类中添加更多方法?的主要内容,如果未能解决你的问题,请参考以下文章
从Asynctask ONPostExecute调用片段方法
android,异步任务类中的Toast如何获得Context?