java - 从 API 请求 json 时无法下载超过 16144 个字符

标签 java android json http download

我有一个 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/

相关文章:

java - 如何在不重新订阅的情况下替换 Flowable

java - 如何在 J2ME 中获取和设置 JSONObject , JSONArray

java - Gson反序列化嵌入成员的json

json - 根据 jq 中的多个值选择条目

android - 底部应用栏导航图标不是垂直居中

json - 使用 $.get 和 @(Html.Raw(Json.Encode(model))) 发布复杂模型的编码问题

java - Spring应用程序对第​​三方应用程序上的所有URL请求(除了/)返回404(在本地主机上工作正常)

java - 为什么我的应用程序VSCode不能在CLI中正确运行?它是一个 Spring 启动应用程序

android - 何时调用 glMatrixMode()

android - 推文的 XML 布局