努力从AsyncTask中提取数据

时间:2016-11-03 18:48:30

标签: java android sockets android-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 个答案:

答案 0 :(得分:0)

如果我理解正确的话:有一个商务舱想知道收到的回复。

所以你的异步任务必须以某种方式通知另一个类,这可以在OnPostExecute方法中完成(除非使用的AsyncTask提供了这样的机制)。如果你必须自己实现它:有很多不同的可能性,从简单的对象等待/通知,使用CompletableFuture更复杂,或者只是传入(进入你的任务类)一个带回调方法的接口。

通知您的商务舱后,例如,通过一个简单的getter访问响应(你仍然需要实现)。