java - 尝试将大型 json 数据发送到 android 中的服务器时出现 OutOfMemoryException?

标签 java android json out-of-memory

我正在尝试一次向 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/

相关文章:

java - 除非打印结果,否则陷入无限循环

Java/C++ - 从相机偏航(航向)和俯仰(无滚动)获取 3d 线

python - 我是否正确地遍历了我的 json 数据?

java - 从动态自定义表中获取 id,行

java - 在 Spring JSP 页面中使用集合时出现 Hibernate LazyInitializationException

android - 单击 ListView 'B' 后如何显示另一个 ListView 'A'

android - SQL计数 从GOB开始的顺序

java - 如何在 Android map 中使用 2 点确定 vector ?

javascript - 将 List 对象从 javascript 转换为 JSON

javascript - 动态地从 JSON 数组键值对中检索键 - Javascript