在读取流的同时发送 GET 请求

Sending GET request while simultaneously reading stream

场景如下:

我正在使用 OkHttp 异步发送获取请求,效果很好。代码如下:

private void doGetRequest(String url){
        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request)
                .enqueue(new Callback() {

                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                        Log.i(TAG,"Response: " + response);
                    }

                    @Override
                    public void onFailure(@NotNull Call call, @NotNull final IOException e) {
                        // Error
                        Log.e(TAG,"Error: " + e);
                       requireActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(requireActivity(), getResources().getString(R.string.error, e.toString()), Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });
    }

我还使用 AsyncTask 来解码 Mjpeg 流。在我的 AsyncTask 的 doInBackground 函数中,我有:

protected Long doInBackground(String... urls) {

    //Get InputStream
    URL url = new URL(urls[0]);
    HttpURLConnection connect = (HttpURLConnection) url.openConnection();
    DataInputStream inputStream = new DataInputStream (connect .getInputStream());
    mjpegStream = new MjpegInputStreamDefault(inputStream);

    //Start decoding mjpeg stream
    while (doRun) {
        publishProgress(mjpegStream.readMjpegFrame());
    }
}

重要的是我一直在通过 WIFI 从我必须向其发送 GET 请求的同一设备解码网络流。

我遇到的问题是,一旦我启动 mjpeg 流,我的 GET 请求就停止接收。如果我停止 mjpeg 流,最终我的 GET 请求会收到,假设尚未达到超时。

我的问题是我可以同时向同一台设备发送和接收内容吗?如果是这样,为什么在接收我的 mjpeg 流时没有收到我的请求?

最后弄清楚发生了什么,我想我会提供一些解释来帮助未来的读者

发生了什么事?

基本上,正如您在此快速图表中看到的,两段代码试图使用相同的连接。

我的流式传输代码不断占用 wifi 摄像头,阻止我的发送代码建立新连接:

如何avoid/solutions?

要纠正这个问题,我们需要共享连接。流以 50fps 的速度更新,但 phone 可以更快地处理网络内容。这意味着我们不需要不断地处理 mjpeg 流来获得 50fps,所以在我的情况下让它不时等待发送命令就可以了。

所以简单地说,接收代码需要知道如果有一个命令正在等待发送,它就不能继续使用连接。有很多方法可以做到这一点,实施将取决于您项目的整体设计。

一个好的方法是使用 observables 模式。 RxJava 实现了 observables 模式的最佳思想等等。

其他想法 起初我以为我可以使用某种双工方法,其中发送代码和接收代码可以独立运行,但除非我弄错了,否则我认为在这种情况下这是不可能的,因为我的接收代码将始终阻止连接.