javascript - 在读取流的同时发送 GET 请求
问题描述
这是场景:
我正在使用 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 流。在doInBackground
我的 AsyncTask 的函数中,我有:
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 摄像头,阻止我的发送代码建立新连接,如下所示:
如何避免/解决方案?
为了纠正这个问题,我们需要共享连接。流以 50fps 的速度更新,但手机可以更快地完成网络工作。这意味着我们不需要不断地处理 mjpeg 流以获得 50fps,因此在我的情况下,让它不时地等待发送命令就可以了。
因此,简单地说,接收代码需要知道如果有等待发送的命令,它就不能继续使用连接。有很多方法可以做到这一点,实施将取决于项目的整体设计。
一种好的方法是使用 observables 模式。RxJava 实现了 observables 模式的最佳思想等等。
其他想法 起初我以为我可以使用某种双工方法,其中发送代码和接收代码可以独立运行,但除非我弄错了,否则我认为在这种情况下这是不可能的,因为我的接收代码总是会阻塞连接。
推荐阅读
- javascript - 使用 jQuery 验证表单提交
- generics - 为什么你可以调用一些不带括号的方法,而对于另一些你必须使用括号(Kotlin)?
- php - 如何修复 pg_query
- python - 如果类名有两个单词并且没有id,如何获取css选择器
- reactjs - 使用酶异步安装后测试反应子组件
- c# - WOPI主机中的UnlockAndRelock方法
- json - 我们可以传递 JSON 格式来阅读文档吗?
- html - 为什么我的 html 元素在使用媒体查询时重复和重叠?
- javascript - 是否可以将全日历的布局从 00:00:00 - 23:59:00 更改为 19:00:00 - 06:59:00?
- python - Django 无法使用有效凭据登录