Android / Java InputStream变空(不可读)

时间:2015-08-15 09:15:30

标签: java android inputstream httpurlconnection

我正在努力解决一个似乎比我最初复杂得多的问题。

我使用的SDK传递给我一个InputStream,我应该使用它来发出一个http请求(该流用于设置正文 - 对于某些请求它是可选的)。我正在使用HttpURLConnection来发出请求并获得响应。

只要我通过静态方法将InputStream(在自定义模型对象中找到)发送到另一个类,就会出现问题。

RequestManager.startRequest(request, callback);

请求包含InputStream。在这一点上它似乎是有效的。

尝试在RequestManager类或其他类中访问InputStream时,它是空的。

我必须指出它被发送到另一个由RequestManager处理的线程。

可能是什么问题?我做了一些调试,InputStream似乎与SDK发送的对象相同。线程运行时,InputStream会发生什么?

LE(读取InputStream的方法):

private String readStream(InputStream inputStream) {
        BufferedReader br = new BufferedReader(new InputStreamReader((inputStream)));
        StringBuilder sb = new StringBuilder();
        String output;
        try {
            while ((output = br.readLine()) != null) {
                sb.append(output);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }

如果我在调用startRequest()之前使用此方法,则返回应该设置为请求主体的String。

一旦我尝试在管理器中使用此方法,它就会返回一个空字符串。

LE:添加了调试的屏幕截图 从SDK 收到的InputStream InputStream received from the SDK 从SDK中读取InputStream - 然后再将其发送给管理员 Read InputStream from SDK - before sending it to manager 在设置正文之前在管理器中读取InputStream Read InputStream inside the manager before setting the body

LE:更新

我已经进行了更多的测试,当从另一个线程直接访问InputSream时,似乎会发生这种情况。如果在创建的同一个线程上访问InputStream,一切正常,但是一旦其他一些线程尝试访问它就变得不可用(似乎读取被阻止)。

1 个答案:

答案 0 :(得分:0)

如上所述,偏移量不同。所以你应该在第二次读取之前重置流(inputStream.reset();)。这是我的建议和答案。希望这有帮助!

更新:

根据InputStream description

  

public synchronized void reset()

     

将此流重置为最后标记的位置。抛出IOException   如果自设置标记以来读取的字节数更大   超过提供给商标的限制,或者没有设定商标。

我认为您应该再次检查所有代码

此外,请参阅以下问题,希望您尽快解决问题:

  1. InputStream will not reset to beginning
  2. Read stream twice