2014-12-13 91 views
1

我试图解码一个JSON字符串,并做一些内容。我有这样的代码运行每当用户按下一个按钮:Java Android的Json OutOfMemoryError

public List<Card> readCards() 
{ 
    List<Card> cards = new ArrayList<Card>(); 

    HttpReader httpReader = new HttpReader(); 
    httpReader.setOnResultReadyListener(new HttpReader.OnResultReadyListener() { 
     @Override 
     public void resultReady(String result) { 
      JsonHelper jsonHelper = new JsonHelper(); 
      List<Card> cards = jsonHelper.getCards(result); 

      for (int i = 0; i < cards.size(); i++) { 
       cards.add(new Card(cards.get(i).getId(), cards.get(i).getNaam(), cards.get(i).getMana(), cards.get(i).getAttack(), cards.get(i).getHealth(), cards.get(i).getEffect(), cards.get(i).getZeldzaamheid(), cards.get(i).getTypeId(), cards.get(i).getSubtypeId(), cards.get(i).getClassId(), cards.get(i).isGoud())); 
      } 
     } 
    }); 
    httpReader.execute("http://jsonstring.com"); //link to json-file 

    return cards; 
} 

jsonHelpergetCards(result)方法是这样的:

public List<Card> getCards(String jsonText) { 
    List<Card> list= new ArrayList<Card>(); 

    try { 
     JSONArray jsonArrayCards = new JSONArray(jsonText); 
     for (int i = 0; i < jsonArrayCards.length(); i++) { 
      JSONObject jsonObjectCard = jsonArrayCards.getJSONObject(i);  

       Card card = new Card(); 
       if (jsonObjectCard.has("id")) { card.setId(jsonObjectCard.getString("id")); } else { card.setId("none"); } 
       if (jsonObjectCard.has("name")) { card.setNaam(jsonObjectCard.getString("name")); } else { card.setNaam("none"); } 
       if (jsonObjectCard.has("cost")) { card.setMana(jsonObjectCard.getInt("cost")); } else { card.setMana(0); } 
       if (jsonObjectCard.has("attack")) { card.setAttack(jsonObjectCard.getInt("attack")); } else { card.setAttack(0); } 
       if (jsonObjectCard.has("health")) { card.setHealth(jsonObjectCard.getInt("health")); } else { card.setHealth(0); } 
       if (jsonObjectCard.has("text")) { card.setEffect(jsonObjectCard.getString("text")); } else { card.setEffect(""); } 
       card.setTypeId(1); 
       card.setSubtypeId(1); 
       card.setClassId(1); 
       list.add(card); 
     } 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    return list; 
} 

此步骤完成后,我试图表现出的大小由于某种原因,返回的列表为0。

第一次应用程序冻结后点击按钮。日志显示java.lang.OutOfMemoryError

json文件是< 200行可能是5kb,这应该不成问题。

任何帮助将不胜感激。

+0

你的json链接实际上是否带回任何东西?我尝试http://jsonstring.com并没有得到任何东西,或者我错过了什么? – 2014-12-13 16:16:23

+0

在我的实际代码中我有一个链接到我的个人网站空间,我在这里省略了。我确实从实际的json链接中得到了一些东西。 – Droes 2014-12-13 16:17:50

+1

在我看来,使用FOR循环,您将再次添加条目。这就是你的真正意图。 – Shiv 2014-12-13 16:21:03

回答

5

你的程序陷入了无限循环。您要添加的信用卡到卡列表不断增加,直到你离开的内存

 for (int i = 0; i < cards.size(); i++) { 
      cards.add(new Card(cards.get(i).getId(),... 
     } 

循环永远无法完成,因为您测试i < cards.size()并与每个new Card添加cards.size增加。

+0

就是这样。不敢相信我没有看到。谢谢回复! – Droes 2014-12-13 16:22:53

2

您的循环是错误

 for (int i = 0; i < cards.size(); i++) 

的for循环的原因,并使用cards.size()在是不是最佳做法。相反使用

 int count = cards.size(); 

始终在for循环中使用此int。这比旧的更快。因为在旧代码中,每次都是你的for循环计数卡