代码之家  ›  专栏  ›  技术社区  ›  RedBlueThing

我是否应该使用getResource().getStringArray()以外的东西来填充大型数组?

  •  5
  • RedBlueThing  · 技术社区  · 15 年前

    跟随安卓 sample for populating a ListView ,我从 StrugsXML 使用 Activity.getResource().getStringArray() :

    String [] mDefinitions = getResources().getStringArray(R.array.definition_array);
    

    这个方法的文档非常清楚,我没有想到会遇到任何问题:

    返回与特定资源ID关联的字符串数组。

    这种方法对小数据集的工作与预期一致。但是,当我填充 StrugsXML 使用完整的数据集(接近2000个条目),我发现应用程序在试图加载资源时崩溃了。我在控制台日志中注意到这个错误:

    可引用溢出(最大值=512)

    在我的 字符串数组 我确认当项目数超过700个条目时,错误是可重复的。

    谷歌搜索这个问题已经找到了其他开发者的一些例子。 having the same problem 但我在Android文档中找不到任何解释。

    有人已经陷入了创造 issue for the problem 在android google的代码页上,但无论是它,还是我看到的任何帖子,都没有得到满意的答案。

    我是否以错误的方式处理问题?我是否应该自己填充数据(加载文件并解析JSON或类似操作)并完全避免这个问题?我好像错过了一些明显的东西。

    2 回复  |  直到 15 年前
        1
  •  7
  •   RedBlueThing    15 年前

    我需要能够为我的特定应用程序解析大型XML文件(我已经用这种方式对数据进行了编码,并且希望保持一致)。

    所以我的第一次尝试是 获取数组 出现问题:

    String [] mDefinitions = getResources().getStringArray(R.array.definition_array);
    

    我的第二次尝试与我遇到的限制相同 获取数组 . 当我尝试处理一个更大的XML文件(>500k)时,我发现dalvikvm崩溃 获得XML :

     XmlResourceParser parser = getResources().getXml(R.xml.index);
    
     try {
         int eventType = parser.getEventType();
    
         while (eventType != XmlPullParser.END_DOCUMENT) {
             String name = null;
    
             switch (eventType){
                 case XmlPullParser.START_TAG:
                     // handle open tags
                     break;
                 case XmlPullParser.END_TAG:
                     // handle close tags
                     break;
             }
    
             eventType = parser.next();
         }
     }
     catch (XmlPullParserException e) {
         throw new RuntimeException("Cannot parse XML");
     }
     catch (IOException e) {
         throw new RuntimeException("Cannot parse XML");
     }
     finally {
         parser.close();
     }
    

    我的最终解决方案,它在 输入流 从原始资源工作中生成。我可以解析大型XML文件,而不会导致dalvikvm崩溃:

     InputStream is = getResources().openRawResource(R.raw.index);
     XmlHandler myXMLHandler = new XmlHandler();
    
     SAXParserFactory spf = SAXParserFactory.newInstance();
     SAXParser sp = spf.newSAXParser();
     XMLReader xr = sp.getXMLReader();
    
     xr.setContentHandler(myXMLHandler);
     xr.parse(new InputSource (is));
    
     } catch (Exception e) {
         System.out.println("XML Pasing Excpetion = " + e);
     }
    

    其中,xmlHandler是:

     public class XmlHandler extends DefaultHandler {
    
         @Override
         public void startElement(String uri, String localName, String qName,
         Attributes attributes) throws SAXException {
         // handle elements open
         }
    
         @Override
         public void endElement(String uri, String localName, String qName)
         throws SAXException {  
         // handle element close
         }
    
         @Override
         public void characters(char[] ch, int start, int length)
         throws SAXException {
         // handle tag characters <blah>stuff</blah>
         }
    
     }
    
        2
  •  2
  •   Sameer Segal    15 年前

    不确定应用程序的目标是什么,但您是否考虑过使用csv文件。

     InputStream is = c.getResources().openRawResource(R.raw.csv_file);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String readLine = null;
    
            int column = 1; 
    
            try {
                while ((readLine = br.readLine()) != null) {
    
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            }