[英]OutOfMemoryError in android while change in orientation?
I am new in android.i am loading data from json.我是 android.i 的新手,我正在从 json 加载数据。 While on orientation change destroy and recreate the activity so the json loading everytime orientation changing..
在方向更改时销毁并重新创建活动,因此每次更改方向时都会加载 json ..
I am getting the following error:我收到以下错误:
{
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.OutOfMemoryError at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
at java.lang.StringBuilder.append(StringBuilder.java:202)
at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
at org.json.JSONTokener.nextValue(JSONTokener.java:97)
at org.json.JSONTokener.readObject(JSONTokener.java:362)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONTokener.readObject(JSONTokener.java:385)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONTokener.readArray(JSONTokener.java:430)
at org.json.JSONTokener.nextValue(JSONTokener.java:103)
at org.json.JSONTokener.readObject(JSONTokener.java:385)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONObject.<init>(JSONObject.java:154)
at org.json.JSONObject.<init>(JSONObject.java:171)
at com.ProjectName.activities.MainActivity.get_Project_Json(MainActivity.java:238)
at com.ProjectName.activities.MainActivity.onCreate(MainActivity.java:115)
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692)
at android.app.ActivityThread.access$700(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
}
especially in JellyBean and KitKat (Device:3.2 to 4.0inches)特别是在 JellyBean 和 KitKat(设备:3.2 到 4.0 英寸)
{ {
public void get_Json_Assets() {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(getAssets().open("Somejson.json")));
String temp;
while ((temp = br.readLine()) != null)
sb.append(temp);
} catch (OutOfMemoryError e) {
e.fillInStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e) {
e.fillInStackTrace();
}
}
all_Point_Json = sb.toString();
}
}
{`public void get_Project_Json() {
get_Json_Assets();
try {
JSONObject point_Json= new JSONObject(all_Point_Json);
JSONArray point_Chapter =point_Json.getJSONArray("chapter");
for (int i = 0; i < point_Chapter.length(); i++) {
HashMap<String, String> mPoint_Details = new HashMap<>();
mPoint_Details.put("mPoint", (String) point_Chapter.get(i));
mPoint_Details.put("mPoint_No", String.valueOf(i + 1));
All_Point.add(mPoint_Details);
}
} catch (JSONException e) {
e.fillInStackTrace();
}
}`}
First of all, your code is very messy.首先,你的代码很乱。 You should clean it up.
你应该把它清理干净。 Moreover, I don't know in which part of Activity life cycle are you calling this code.
而且,我不知道你在Activity生命周期的哪个部分调用这段代码。 I suppose, you're doing it in
onResume()
or onCreate()
method.我想,您是在
onResume()
或onCreate()
方法中进行的。 Probably this *.json
file contains a lot of data and you are allocating memory for it.可能这个
*.json
文件包含大量数据,您正在为其分配内存。 During screen rotation, you're doing it again, after next rotation, memory is allocated again and so on.在屏幕旋转期间,您将再次执行此操作,在下一次旋转后,将再次分配内存,依此类推。 You should clean memory in
onPause()
method or load this data in a different way (eg in the Service and then pass it to Activity).您应该在
onPause()
方法中清理内存或以不同的方式加载此数据(例如,在服务中然后将其传递给活动)。 In addition, you should avoid loading large files at once.此外,您应该避免一次性加载大文件。 You can consider loading parts of that file successively and for sure load this data in a separate thread (eg with AsyncTask or RxJava if you're familiar with it), because it's non-deterministic and probably a long operation.
您可以考虑连续加载该文件的一部分,并确保在单独的线程中加载这些数据(例如,如果您熟悉 AsyncTask 或 RxJava),因为它是不确定的,并且可能是一个很长的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.