【发布时间】: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