попытка извлечь данные из AsyncTask

Какой лучший способ извлечь данные из AsyncTask? Есть ли лучший способ управления данными в фоновом режиме?

До сих пор это функция, которую я использую, чтобы сделать связь сокета и изменить сообщения:

public class MyClientTask extends AsyncTask<Void, Void, Void> {
    String dstAddress;
    int dstPort;
    String response = "";

    MyClientTask(String endereco, int porta) {
        dstAddress = endereco;
        dstPort = porta;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            socket = new Socket(dstAddress, dstPort);
            socketStatus = true;

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
            int bytesRead;
            InputStream inputStream = socket.getInputStream();
            /*
             * notice:
             * inputStream.read() will block if no data return
             */
            response = "";
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response = byteArrayOutputStream.toString("UTF-8");
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
            socketStatus = false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

Как я вижу, это быстро обрабатывать, но как мне удается извлечь «ответ» из этого кода с помощью onPostExecute?

1 ответ

  1. Если я вас правильно понял: где-то есть бизнес-класс, который хочет быть информированным о полученном ответе.

    Таким образом, ваша асинхронная задача должна каким-то образом уведомить этот другой класс, что может быть сделано в методе OnPostExecute (если только используемая AsyncTask не предлагает себе такой mechanisme). Если вы должны реализовать его самостоятельно: есть много различных возможностей, от простого объекта wait/notify, над более сложным использованием CompletableFuture, или просто передачи в (в ваш класс задач) интерфейс с методом обратного вызова.

    После того, как ваш бизнес-класс был уведомлен, он может, например, получить доступ к ответу с помощью простого геттера (который вы все еще должны реализовать).