将Encode Base64的字符串结果放入JSONObject Out of Memory

时间:2018-02-23 07:29:27

标签: android json base64 out-of-memory

我读了很多关于OOM的问题,但我仍然被困住了。我无法使用jsonObject.toString来获取数组bytes。我有一个相机拍摄的图像,我想将其发送到服务中。我用HTTP POST发送格式为:

{
 request : {
            image : encodedImageWithBase64
           }
}

但我不能使JSONObject成为OOM。这里来自结果编码图像的字符串示例:https://pastebin.com/RUXae9VU

这是我的代码段:

JSONObject requestDict = new JSONObject();
            try {
                JSONArray tempRequestDic = new JSONArray();
                JSONObject obj = new JSONObject();
                obj.put("imagedata", strEncode64);
                tempRequestDic.put(obj);

                obj.put("image", tempRequestDic);
                requestDict.put("request", obj); /* Here I get the Exception*/

//                    String strReqDict = String.valueOf(requestDict);
//                    File x = new File(String.valueOf(requestDict));
                byte[] byteBitmapDecoded = requestDict.toString().getBytes(); /* Here my apps force stop cause OOM */
            } catch (JSONException e) {
                e.printStackTrace();
            }

日志是:

  

抛出OutOfMemoryError"无法分配带有16777216个空闲字节的301989896字节分配和283MB直到OOM"

我需要来自此JSONObject的byte[],但我无法构建JSONObject本身。

1 个答案:

答案 0 :(得分:1)

尝试将android:hardwareAccelerated="false"android:largeHeap="true"添加到您的清单中。由于OOM是处理位图时最常见的错误。

<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme">

尝试使用此代码,将JSONObject转换为byteArray。

  byte[] byteBitmapDecoded = Base64.decode(requestDict.toString, Base64.DEFAULT);