【问题标题】:Converting JSONObject to JsonObject throwing out of memory exception [duplicate]将JSONObject转换为JsonObject抛出内存异常[重复]
【发布时间】:2016-12-13 14:25:01
【问题描述】:

我需要在我的项目中将 JSONObject 转换为 JsonObject(Gson 特定格式)。为此,我使用以下方法进行相同的转换

public static  JsonObject getJsonFromJSONObject(JSONObject json) {

        JsonObject jsonObject = null;
        try {
            JsonParser jsonParser = new JsonParser();
            jsonObject = (JsonObject) jsonParser.parse(json.toString());

        }catch (Exception e){

            CLog.e(Constants.LOG_TAG, e.getMessage());
        }
        return jsonObject;
    }

在我的应用程序的测试阶段一切正常。但在一些罕见的现象中,内存不足异常。一周以来,我完全被这种情况所困扰,但我仍然无法找到任何解决方案。

我得到的错误:

Fatal Exception: java.lang.OutOfMemoryError
      at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
      at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:133)
      at java.lang.StringBuilder.append(StringBuilder.java:124)
      at org.json.JSONStringer.string(JSONStringer.java:344)
      at org.json.JSONStringer.value(JSONStringer.java:252)
      at org.json.JSONArray.writeTo(JSONArray.java:602)
      at org.json.JSONStringer.value(JSONStringer.java:233)
      at org.json.JSONObject.writeTo(JSONObject.java:672)
      at org.json.JSONObject.toString(JSONObject.java:641)
      at com.android.package.http.utils.JSONUtils.getJsonFromJSONObject(Unknown Source)
      at android.app.ActivityThread.handleReceiver(ActivityThread.java:2573)
      at android.app.ActivityThread.access$1700(ActivityThread.java:151)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
      at android.os.Handler.dispatchMessage(Handler.java:110)
      at android.os.Looper.loop(Looper.java:193)
      at android.app.ActivityThread.main(ActivityThread.java:5299)
      at java.lang.reflect.Method.invokeNative(Method.java)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
      at dalvik.system.NativeStart.main(NativeStart.java)

60 万用户中有 26,000 名用户反映了上述错误。我不知道我在哪里落后于解决这个问题。任何一种解决方案和建议都会对我有所帮助。提前致谢。

【问题讨论】:

  • 60 万 个用户有多少?
  • 请检查我的编辑。

标签: android json out-of-memory retrofit2 gson


【解决方案1】:

尝试将 JSONObject 写入文件,并从文件中读取为 jsonObject

用于编写 JSONObject

ObjectOutputStream out = null;
        FileOutputStream fos = null;

        try {
            File file = new File(fc.getLocalCache().getAbsolutePath() + "/" + folderId + ".srl");
            fos = new FileOutputStream(file);

            out = new ObjectOutputStream(fos);
            out.writeObject(response.toString());
        } catch (OutOfMemoryError | Exception e) {
            e.printStackTrace();
        }

用于读取对象

try {
            FileInputStream isf = new FileInputStream(new File(fc.getLocalCache() + "/" + folderId + ".srl"));
            ObjectInputStream in = new ObjectInputStream(isf);
            String json = (String) in.readObject();
            JsonParser parser = new JsonParser();
            JsonObject o = parser.parse(json).getAsJsonObject();
            //Gson gSon=  new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create();
            jsonObject = new Item();
            jsonObject.setRawObject(new DefaultSerializer(new DefaultLogger()), o); //new Gson().fromJson(o, Item.class);
            in.reset();
            in.close();
            isf.close();
            // Log.i("jsonObject", jsonObject.toString());
        } catch (Exception e) {
            e.printStackTrace();
            //Log.i("getObjectsFromLocal Exception", e.toString());
            return jsonObject;
        }

注意 要生成内存不足异常,您可能需要内存不足的移动设备和大于 2 或 3MB 的 json 大小。(这可能对您有用)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多