3

I have a large json response. I am storing it in a String. But I am getting out of memory error while parsing this json.
Here i am parsing like this

public ArrayList<String> parsing()
   {
   System.out.println("parsing start");
   ArrayList<String> urls=new ArrayList<String>();

   smusicname=null;smoviename=null;
   sbookname=null;stelevisionname=null;

   int position=0;
    try {  
    JSONObject node1=new JSONObject(response);              
    JSONArray array1=node1.getJSONArray("data");
    int length=array1.length();
    for(int i=0;i<length;i++){
        if(array1.getJSONObject(i).getString("id").equals(friendId.toString())){
            position=i;
        }
    }
       JSONObject node2 = array1.getJSONObject(position);
          try{
              if(node2.has("music"))  {
                 JSONArray array2=node2.getJSONObject("music").getJSONArray("data");
                JSONObject node4=array2.getJSONObject(0);

                String name=node4.getString("name");
                smusicname=name;
                JSONObject node5=node4.getJSONObject("picture");
                JSONObject node6=node5.getJSONObject("data");
                String musicsurl=node6.getString("url");
                urls.add(musicsurl);                  }
                }
          catch(JSONException e)    {
              e.printStackTrace();
            }
          try{
              if(node2.has("movies")){
                  JSONArray array2=node2.getJSONObject("movies").getJSONArray("data");
                JSONObject node4=array2.getJSONObject(0);
                String name=node4.getString("name");
                smoviename=name;
                JSONObject node5=node4.getJSONObject("picture");
                JSONObject node6=node5.getJSONObject("data");
                String moviesurl=node6.getString("url");
                urls.add(moviesurl);
              }
              }
              catch(JSONException e){
                  e.printStackTrace();
                }
          try{
              if(node2.has("books")) {
              JSONArray array2=node2.getJSONObject("books").getJSONArray("data");
                JSONObject node4=array2.getJSONObject(0);
                String name=node4.getString("name");
                sbookname=name;
                JSONObject node5=node4.getJSONObject("picture");
                JSONObject node6=node5.getJSONObject("data");
                String bookurl=node6.getString("url");
                urls.add(bookurl);

              }
          }
              catch(JSONException e){
                e.printStackTrace();
              }
          try{
              if(node2.has("television")) {
              JSONArray array2=node2.getJSONObject("television").getJSONArray("data");
                JSONObject node4=array2.getJSONObject(0);
                String name=node4.getString("name");
                stelevisionname=name;
                JSONObject node5=node4.getJSONObject("picture");
                JSONObject node6=node5.getJSONObject("data");
                String televisionsurl=node6.getString("url");
                urls.add(televisionsurl);
              }
          }
              catch(JSONException e) {
                e.printStackTrace();
              }
        } catch (Exception e) {
            Log.i("JSONException", e.getMessage());
    }
    return urls;
   }`

Here i am getting out of memory error

JSONObject node1=new JSONObject(response);
where response is the string where i stored the json response.

And this is my logcat message

`07-25 09:47:21.906: E/dalvikvm-heap(1055): Out of memory on a 634-byte allocation.
07-25 09:47:21.906: I/dalvikvm(1055): "AsyncTask #9" prio=5 tid=17 RUNNABLE JIT
07-25 09:47:21.906: I/dalvikvm(1055):   | group="main" sCount=0 dsCount=0 obj=0x4101bd90 self=0x2a929320
07-25 09:47:21.916: I/dalvikvm(1055):   | sysTid=1144 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=714125688
07-25 09:47:21.916: I/dalvikvm(1055):   | state=R schedstat=( 1364254144 10263103582 272 ) utm=129 stm=7 core=0
07-25 09:47:21.916: I/dalvikvm(1055):   at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:~94)
07-25 09:47:21.926: I/dalvikvm(1055):   at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:162)
07-25 09:47:21.926: I/dalvikvm(1055):   at java.lang.StringBuilder.append(StringBuilder.java:311)
07-25 09:47:21.926: I/dalvikvm(1055):   at org.json.JSONTokener.nextString(JSONTokener.java:212)
07-25 09:47:21.926: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:107)
07-25 09:47:21.926: I/dalvikvm(1055):   at org.json.JSONTokener.readObject(JSONTokener.java:385)
07-25 09:47:21.926: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:100)
07-25 09:47:21.956: I/dalvikvm(1055):   at org.json.JSONTokener.readObject(JSONTokener.java:385)
07-25 09:47:21.956: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:100)
07-25 09:47:21.956: I/dalvikvm(1055):   at org.json.JSONTokener.readObject(JSONTokener.java:385)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:100)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONTokener.readArray(JSONTokener.java:430)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:103)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONTokener.readObject(JSONTokener.java:385)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONTokener.nextValue(JSONTokener.java:100)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONObject.<init>(JSONObject.java:154)
07-25 09:47:21.966: I/dalvikvm(1055):   at org.json.JSONObject.<init>(JSONObject.java:171)
07-25 09:47:21.966: I/dalvikvm(1055):   at com.facebook.androidd.MyFragment.parsing(MyFragment.java:662)
07-25 09:47:21.966: I/dalvikvm(1055):   at com.facebook.androidd.MyFragment$DownloadImagesTask1.doInBackground(MyFragment.java:432)
07-25 09:47:21.966: I/dalvikvm(1055):   at com.facebook.androidd.MyFragment$DownloadImagesTask1.doInBackground(MyFragment.java:1)
07-25 09:47:21.966: I/dalvikvm(1055):   at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-25 09:47:21.966: I/dalvikvm(1055):   at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-25 09:47:21.966: I/dalvikvm(1055):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-25 09:47:21.966: I/dalvikvm(1055):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-25 09:47:21.966: I/dalvikvm(1055):   at java.lang.Thread.run(Thread.java:856)`

plz help me.

1
  • Didn't any proposed answer help you? Commented Sep 1, 2014 at 11:55

2 Answers 2

1

You shouldn't go for a bad fix like increasing heap size. It may fix your problem temporarily but at some point (if the JSON gets larger than it can be stored in memory at all), it will crash again.

The proper and authentic way is to use GSON streaming. You can Google it or just check out this link. It's not terribly difficult either. Have fun! ;)

PS: there are other ways to do this, for instance I read that you could use Jackson in place of GSON and that there's this JsonReader class in Android SDK (API 11+) to do the same.

Sign up to request clarification or add additional context in comments.

Comments

0

Mostly the error will occur due to heap size. You need to increase the size of the heap

To increase the heap size

For additional info on heap size in java visit here

4 Comments

:i can't increase the heap size in device.and also it is a bad practice.i have to recycle my object properly.i think the variable where i am storing the large response is getting out of memory during parsing.
other than that you can't make large strings in application.
Make a arraylist of bitmap and add to it....and after that resized that bitmap object of your image url..
I didn't get it.sorry i am a beginner.can u plz elaborate it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.