2011-05-05 28 views
1

首先,我有一个扩展AsyncTask的类。然后在doInBackground()方法中,我有一些发布HTTP POST消息的代码,并获得响应。Android getInputStream()不检索所有字节,但只是零星地检索

DataInputStream dis = new DataInputStream(conn.getInputStream()); 
byte[] data = new byte[32768]; 
len = dis.read(data, 0, 32768); 

if (len > 0) 
{ 
    response = new String(data, 0, len); 
} 

此时,反应应该是4127个字节(由服务器证实):此反应如下被读入的字符串。它的1/5时间是4127字节。时间的2/5是1205个字节,时间的2/5是3853个字节。我可以关闭应用程序,重新安装,并获得相同的变化。

管理服务器的人会记录所有内容,并且可以确认相同的数据一遍又一遍地被发送。但Android并没有获得全流。这是无线的,不是3G。当我使用调试器时,我可以看到返回的字符串总是相同的,只是在随机点切断。

对不起,这样的模糊(愚蠢吗?)的问题,但我一直在看这几个小时,我看不出有什么地方错了...

回答

1

read方法文档说:读取将包含的输入流中的最多len个字节的数据转换为字节数组。尝试读取多达len字节,,但较小的数字可能被读取为,可能为零。实际读取的字节数作为整数返回。

根据不同的条件,有时您可以读取所有服务器发送的数据,有时候会有短读。为了获得所有数据,您应该继续读取流中的数据,直到len为-1,表示EOF。

InputStream in = ...; 
byte[] dst = new byte[32768]; /* Assuming total len is < 32768 */ 
int idx = 0; 
do { 
    int len = in.read(dst, idx, 32768 - idx); 
    idx += len; 
} while (len >= 0 || idx < 32768); 
+0

非常感谢! – Paul 2011-05-06 13:04:05