Java Android Json OutOfMemoryError

文章标签: json,android
2014-12-17 13:03:38     人阅读    

 

目前在实现一个andorid功能,  在用户点击按钮的时候解析一个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;
}

jsonHelper 类的 getCards(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;
}

上面的代码执行完毕后,返回的list的size是 0, 并且控制台显示错误 a java.lang.OutOfMemoryError,
问题在于 ,json文件的长度不超过200行,大小才5KB,不应该出现内存溢出的问题呀...

 

 

处理方法

 

你上面的代码出现死循环了,一直向 cards添加内容,直到内存溢出,出现问题的代码如下

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

因为你的cards 的内容一直在增长,所以 这个条件永远成立,就造成了死循环了..


原文地址:http://www.itmmd.com/201412/329.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

升级SDK Manager后引起的Android Developer ToolKit版本不一致问题   上一篇
下一篇  andorid开发中 检测并处理 JSONArray 返回的空值问题
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!