如何在 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 类中添加更多方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的AsyncTask类中获取数据?

在任何地方使用我的 AsyncTask 类中的变量

从Asynctask ONPostExecute调用片段方法

android,异步任务类中的Toast如何获得Context?

无法覆盖 AsyncTask 类中的 onPostExecute() 方法或使其触发

我如何在我的异步任务类中使用圆形旋转进度条