2016-05-30 21 views
-1

我是android.i的新成员,正在从json加载数据。虽然对取向变化破坏和重建,因此JSON装载每次方向改变活动..Android中OutOfMemoryError在方向上的变化?

我收到以下错误:

{ 
    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) 
     } 

特别是在豆形软糖和奇巧(设备: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(); 
    } 

}`} 
+3

你也应该发布代码。 – Alok

+0

也许试图描述这个json文件的内容?如果这是一个巨大的文件,这是什么可能会导致欧姆错误 –

+1

我的心理能力今天很低,你可以发布实际造成这种情况的代码吗? – m0skit0

回答

0

首先,你的代码是非常杂乱。你应该清理它。而且,我不知道你在调用这个代码的哪一部分Activity生命周期。我想,你正在使用onResume()onCreate()方法。可能这个*.json文件包含大量数据,并且您正在为其分配内存。在屏幕旋转过程中,您将再次执行此操作,下一次旋转后,会再次分配内存等等。您应该清除onPause()方法中的内存或以不同方式加载此数据(例如,在服务中,然后将其传递给活动)。另外,你应该避免一次加载大文件。您可以考虑连续加载该文件的某些部分,并确保将这些数据加载到单独的线程中(例如,如果您熟悉它,请使用AsyncTask或RxJava),因为它是非确定性的,可能是一个长操作。

+0

感谢您的回复。如何在android.I中清理内存我没有打开你的意思是清除内存? –

+0

我的意思是你可以清除stringBuilder,如下所示:'stringBuilderObj.setLength(0)',但我不确定它是否会有帮助,因为我不知道整个上下文。这只是一个提示。 –

+0

我尝试了上面的提示,它也崩溃了。我做了AsyncTask也崩溃了。 –