繁体   English   中英

Android / Java InputStream变为空(不可读)

[英]Android/Java InputStream becomes empty (unreadable)

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

我使用一个SDK,该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。

一旦我尝试在管理器中使用此方法,它将返回一个空的String。

LE:添加了从SDK接收到的调试InputStream的屏幕截图 从SDK收到的InputStream 从SDK读取InputStream-将其发送给管理器之前 从SDK读取InputStream-将其发送给管理器之前 设置正文之前,请先在管理器中阅读InputStream 设置正文之前,请先在管理器中阅读InputStream

LE:更新

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

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

更新:

根据InputStream描述

公共同步无效重置()

将此流重置到最后标记的位置。 如果自设置标记以来已读取的字节数大于提供给标记的限制,或者未设置标记,则抛出IOException。

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

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

  1. InputStream不会重置为开始
  2. 两次读取流

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM