我宣布这样一个对象:
Response getMessagesResponse;
if (page == 0) {
getMessagesResponse = myRequest.newCall(getMessagesRequest).execute();
System.out.println("response "+getMessagesResponse.body().string());
无论我多久运行一次,上面的代码都会打印一个空字符串。现在,如果我在同一行分配和调用对象,如下所示:
if (page == 0) {
Response a = sisgradRequest.newCall(getMessagesRequest).execute();
System.out.println("response "+a.body().string());
它会起作用。为什么?我总是在java中做过这样的事情并没有问题。这里的newCall方法来自OkHttp3 java库。
更新:
在第一个代码中的System.out.println()之前的,我有这一行:
this.magicalNumber = getMagicalNumber(getMessagesResponse.body().string());
事实证明,如果我把System.out.println()放在它之前,我得到了打印。如果我把它放在后面,我就无法得到它。为什么?也许是因为getMagicalNumber中的jSoup处理数据然后从主对象中删除它?
答案 0 :(得分:1)
正如@Taylor评论的那样,ResponseBody
是一个只能被消费一次的流。来自documentation,
响应正文只能使用一次。
此类可用于传输非常大的响应。例如,可以使用此类来读取大于分配给当前进程的整个内存的响应。它甚至可以传输大于当前设备总存储量的响应,这是视频流应用程序的常见要求。
由于此类不会在内存中缓冲完整响应,因此应用程序可能无法重新读取响应的字节。使用此镜头可以使用
流式传输回复bytes()
或string()
将整个回复读入内存。或者使用source()
,byteStream()
或charStream()