【问题标题】:Sending GET request while simultaneously reading stream在读取流的同时发送 GET 请求
【发布时间】:2019-11-26 07:11:49
【问题描述】:

场景如下:

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

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 流时没有收到我的请求?

【问题讨论】:

  • 不想搞笑,但你对 RxJava 了解多少?由于您使用的是 AsyncTask,我将假设为 0,因此您可能想开始学习 RxJava,尤其是关于 observables 以及一些函数,如 .zip 或 .merge 或 BiFunctions。不幸的是,这可能会完全重写您现有的代码,因此这不是一个简单的堆栈溢出答案。祝你好运
  • 我想我有一点经验。我知道可观察对象的方式,但我不确定我想如何构建事物。我认为这个问题与阻塞有关,因为我的连接共享很差。
  • why are my requests not getting received while my mjpeg stream is being received?。好问题。我还没有答案,但希望你知道这个问题很有趣。
  • 所以,如果您使用 RxJava,您可以同时触发两个网络调用,并且(取决于您的需要)您可以等待两者完成,或者只是在它们即将到来时执行它们(流,如果它是一个真正的流会持续更长时间)。您当前的问题可能是由于您在“doGetRequest”完成后从主线程调用这些后台线程
  • 谢谢,这有点帮助,实际上发生的事情比最初看到的要多。首先,get 请求是我从另一个堆栈溢出答案 stackoverflow.com/questions/34967505/… 尝试的,它的目的是异步发送请求,但至少在我的情况下,它只是在 ~8 次后拒绝发送请求。

标签: javascript android android-asynctask okhttp


【解决方案1】:

最终弄清楚发生了什么,并认为我会提供一些解释以帮助未来的读者

发生了什么?

基本上,您可以在此快速图表中看到尝试使用相同连接的两条代码。

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

如何避免/解决办法?

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

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

一种好的方法是使用可观察模式。 RxJava 实现了 observables 模式的最佳理念等等。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2016-04-18
    • 1970-01-01
    • 2021-05-23
    • 2018-05-20
    • 2012-06-05
    相关资源
    最近更新 更多