我正在努力解决一个似乎比我最初复杂得多的问题。
我使用的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 从SDK中读取InputStream - 然后再将其发送给管理员 在设置正文之前在管理器中读取InputStream
LE:更新
我已经进行了更多的测试,当从另一个线程直接访问InputSream时,似乎会发生这种情况。如果在创建的同一个线程上访问InputStream,一切正常,但是一旦其他一些线程尝试访问它就变得不可用(似乎读取被阻止)。
答案 0 :(得分:0)
如上所述,偏移量不同。所以你应该在第二次读取之前重置流(inputStream.reset();)。这是我的建议和答案。希望这有帮助!
更新:
public synchronized void reset()
将此流重置为最后标记的位置。抛出IOException 如果自设置标记以来读取的字节数更大 超过提供给商标的限制,或者没有设定商标。
我认为您应该再次检查所有代码
此外,请参阅以下问题,希望您尽快解决问题: