将 JSONObject 转换为 JsonObject 抛出内存异常
Converting JSONObject to JsonObject throwing out of memory exception
我需要在我的项目中将 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.access00(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 名用户反映了上述错误。我对解决这个问题的滞后之处一无所知。任何有点解决方案和建议都会对我有所帮助。提前致谢。
尝试将 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;
}
注意
要生成内存不足异常,您可能需要低内存移动设备和 json 大小大于 2 或 3MB。(这可能适合您)
我需要在我的项目中将 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.access00(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 名用户反映了上述错误。我对解决这个问题的滞后之处一无所知。任何有点解决方案和建议都会对我有所帮助。提前致谢。
尝试将 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;
}
注意 要生成内存不足异常,您可能需要低内存移动设备和 json 大小大于 2 或 3MB。(这可能适合您)