我有一个 Android 应用程序,它将其信息下载为 JSON。
典型的 JSON 下载约为 2,000-3,000 个字符。但我想强调一下,所以我创建了一个更大的文件(约 48,000 个字符)。随着文件的推移,它仍然很小,不到 50kb。
我遇到的问题是下载时我只获得 16144 个字符的数据。也就是说,reader.readLine()
仅返回一行包含 16144 个字符,client.execute(request, new BasicResponseHandler());
也是如此。显然,只有文件的一部分,我的 JSON 解析代码很快就会失败,因为它不是有效的 JSON 对象。
没有引发异常,因此不是内存不足错误。该问题在 HTC Desire (2.2) 和 Galaxy Nexus (4.1.1) 上重复出现,因此也不是特定于操作系统的。我已经在网络浏览器中测试了该 URL,它工作正常,所有 JSON 都可用,因此不是服务器错误。
问题
谁能指出为什么它只下载 16144 个字符,以及如何让它下载整个文件?
方法#1
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
str.append(line);
}
in.close();
result.setJSONResult(str.toString());
方法#2
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);
String json = client.execute(request, new BasicResponseHandler());
result.setJSONResult(json);
注意 - 该网址位于 LAN 网络上 (http://192.168.0.99:8080...),因此我没有将其包含在内,因为它没有用。
更新 - 已修复
解决了问题。最后我将其归结为文件传输问题而不是手机的内存限制。虽然它在 PC(Chrome)上运行,但我发现它在 Android 以外的其他地方(例如在网站上)出现问题,并且其他浏览器(Safari)无法使用原始 API 调用。根本问题是网络服务器的代理 ngix,想要缓冲更大的响应(超过 32kb),但它从未对用于缓冲的服务器文件夹具有写入权限。这意味着它发送了部分文件,开始缓冲并由于无法写入而出现严重错误。当它出错时,它停止发送文件的其余部分,因此它停止在异常数量的字节处。感谢您的帮助!
最佳答案
这是因为这是一个字符串可以容纳的最大大小——根据 Java 规范,它总是 2147483647 (2^31 - 1),数组的最大大小,String 类用于内部存储)或最大堆的一半大小(因为每个字符都是两个字节),以较小者为准。
堆大小可能会小于 40kbs
您可以使用 json reader 而不是使用字符串来存储来自 Web 的数据,请参阅 http://developer.android.com/reference/android/util/JsonReader.html
关于java - 从 API 请求 json 时无法下载超过 16144 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12246216/