2016-05-30 4 views
-1

私はandroid.iの新機能です.jsonのデータを読み込んでいます。オリエンテーションの変更中にアンドロイドにOutOfMemoryErrorがありますか?

:特にJellyBeanとキットカット(3.2 4.0インチのデバイス)に

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

:私は次のエラーを取得しています

..姿勢変化に変更JSONローディング毎回の向きそう活性を破壊し、再作成しながら、

{

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ファイルの内容を記述しようとしますか?それが大規模なファイルの場合、これはoomエラーを引き起こす可能性があります –

+1

私の精神力は今日低いです、あなたは実際にこれを引き起こしているコードを投稿できますか? – m0skit0

答えて

0

まず第一に、あなたのコードは非常に厄介です。あなたはそれをきれいにする必要があります。さらに、このコードをActivityライフサイクルのどの部分に呼んでいるのかわかりません。あなたはonResume()またはonCreate()メソッドでそれをやっていると思います。おそらくこの*.jsonファイルには多くのデータが含まれており、そのためにメモリを割り当てています。画面の回転中に、次回の回転後にもう一度やり直し、メモリが再び割り当てられます。 onPause()メソッドでメモリを消去するか、このデータを別の方法でロードする必要があります(たとえば、サービス内でアクティビティに渡してください)。さらに、大きなファイルを一度に読み込まないようにする必要があります。そのファイルの部分を連続してロードすることを検討し、非決定論的でおそらく長い操作であるため、このデータを別のスレッド(AsyncTaskやRxJavaなど)に確実にロードすることができます。

+0

お返事ありがとうございました。アンドロイドでメモリをクリーンにする方法はありませんでした。私はヒントを得ていませんでした。 –

+0

「stringBuilderObj.setLength(0) 'のようにstringBuilderをクリアすることができましたが、全体のコンテキストがわからないために役立つかどうかはわかりません。それは単なるヒントです。 –

+0

私は上記のヒントもクラッシュしてみました。私もAsyncTaskをクラッシュさせました。 –

関連する問題