我有一个很大的json response
。我将它存储在一个字符串中。但是在解析这个json时我出现了内存错误。
这里我正在解析这个
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;
}`
这里我出现内存不足错误
JSONObject node1=new JSONObject(response);
其中response是我存储json响应的字符串。
这是我的logcat消息
`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)`
请帮助我。
答案 0 :(得分:1)
你不应该像增加堆大小那样做一个糟糕的修复。它可能暂时解决您的问题,但在某些时候(如果JSON大于它可以存储在内存中),它将再次崩溃。
正确而真实的方法是使用GSON streaming
。您可以谷歌它或只是查看this链接。它也不是非常困难。玩得开心! ;)
PS:还有其他方法可以执行此操作,例如我读到您可以使用Jackson
代替GSON
并且在Android中使用此JsonReader
类SDK(API 11+)也是这样做的。
答案 1 :(得分:0)