我正在尝试一次向 PHP 服务器发送多个 Json 字符串 [每个 1 MB]。当我尝试发送 10 条记录时,它工作正常。但如果它超过 20 条记录,它会显示 OutOfMemoryException
。我看到 android 内存大小限制 t0 15MB - 16MB。但是不知道如何解决这个问题,
我使用以下代码一次发送多条记录。
/** Upload Data*/
private void submitUploadData(String url, Map<String, String> param)
throws IOException {
URL siteUrl;
try {
siteUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) siteUrl
.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
String content1 = "";
Set getkey = param.keySet();
Iterator keyIter = getkey.iterator();
String content = "";
for (int i = 0; keyIter.hasNext(); i++) {
Object key = keyIter.next();
if (i != 0) {
content += "&"; //Crashing here
}
content += key + "=" + param.get(key); //Crashing here
System.out.println("Content" + content);
}
System.out.println(content);
out.writeBytes(content.trim());
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String jsonresponse = "";
while ((jsonresponse = in.readLine()) != null) {
System.out.println(jsonresponse);
if(!jsonresponse.equals("Authorisation Successful")){
updateUploadRecords(jsonresponse);}
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
最佳答案
乍看之下,您的代码没有任何问题,但您正在使用已知会浪费内存的所有可能类型的方法,而现在您尝试进行大型操作时,内存不足,这肯定会发生.
提示:
- 不要用
str1 += str2 + "other val"
连接字符串 你刚刚在内存中创建了 3 个新字符串。请改用 StringBuilder。 - 调用 System.gc()(有些人会建议您)对您没有帮助,因为您在执行此操作的循环中并且该方法仅提示系统可能是 GC 的好时机,但直到系统实际上会绕过它,你已经崩溃了。
- 如果每个 JSON 字符串大约 1mb,而您要传递其中的 20 个,那么您已经在旧设备上因内存不足而崩溃,而这 20mb 就在那里。您将不得不重新设计很多东西,但我的建议是只删除 map ,完全删除它。
相反,您应该(在创建该 map 的方法上)使用某种类型的 OutputStream
来写入所有已在临时文件中格式化的数据。然后,要上传,您将使用某种类型的 InputStream
读取此文件并写入您的 DataOutputStream
Streams 的替代方法是使用其他一些基于与流相同的方法的类,它们是:JsonWriter/JsonReader,但是如果您传递的不是特定的 Json,那么您也有 FileWriter/FileReader,并且不要不要忘记总是用 BufferedReader 和 BufferedWriter 包装它们。
关于java - 尝试将大型 json 数据发送到 android 中的服务器时出现 OutOfMemoryException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15243674/