Java声明对象但是将其分配到内部'如果'不会工作

时间:2016-08-17 20:39:00

标签: java okhttp

我宣布这样一个对象:

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处理数据然后从主对象中删除它?

1 个答案:

答案 0 :(得分:1)

正如@Taylor评论的那样,ResponseBody是一个只能被消费一次的流。来自documentation

  

响应正文只能使用一次。

     

此类可用于传输非常大的响应。例如,可以使用此类来读取大于分配给当前进程的整个内存的响应。它甚至可以传输大于当前设备总存储量的响应,这是视频流应用程序的常见要求。

     

由于此类不会在内存中缓冲完整响应,因此应用程序可能无法重新读取响应的字节。使用此镜头可以使用bytes()string()将整个回复读入内存。或者使用source()byteStream()charStream()

流式传输回复

另请参阅此答案:https://stackoverflow.com/a/32307866/1371329