简体   繁体   中英

OutOfMemoryError in android while change in orientation?

I am new in android.i am loading data from json. While on orientation change destroy and recreate the activity so the json loading everytime orientation changing..

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)

{

    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. I suppose, you're doing it in onResume() or onCreate() method. Probably this *.json file contains a lot of data and you are allocating memory for it. 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). 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM