将文本文件加载到Android应用程序 - 尽管文件不重,但内存不足

时间:2014-08-03 19:50:13

标签: android out-of-memory

到目前为止,我无法理解当我将9个不同的文本文件加载到我的Android应用程序时,为什么会出现内存异常。文本文件的总大小约为10 MB。我希望在清单文件中更改为大堆,以便能够加载这些文件。它不是一个好的解决方案,所以我想知道是否有人可以帮助我理解是什么原因导致堆积超过100 MB。

另一件事,可能是一些东西的线索??,是当堆积已经超过100 MB并且分配的内存在下面 - 所有加载都完成了,发生了一些事情:

垃圾收集器在加载完成后立即生成一些东西 - 分配的空间从100 MB急剧下降到35 MB。

所以我想知道 - 发生了什么?为什么加载这么耗费内存?

我可以说我有一个名为FileManager的类,其中所有加载都在进行。

因为FileManager不扩展Activity,所以我必须将一个上下文传递给这个类。 可能是内存消耗的上下文?我认为它可能是,并且我必须在应用程序首次启动应用程序时移动加载。

这是FileManager-class

 public class FileManager {

private String[][] solarObj,, celestObj, stars, sun, moon, venus, march, jupiter, saturn;
private ArrayList <String[][]> stringObjects = new ArrayList <String[][]> () ; 
private String[] textFile; 
private Context context;
private AssetManager assetManager;

public FileManager(Context context) {

    this.context = context;
    assetManager = context.getResources().getAssets();
    instanciateStrings();

    putStringsToList();

    initializeTextFile();

    for (int array_index = 0; array_index < 9; array_index++) {

        read(this.textFile[array_index], this.stringObjects.get(array_index).length, array_index);
        //printString(array_index);
    }
}


    private void instanciateStrings() {

    this.solarObj = new String[98][4];
    this.celestObj = new String[7][3];
    this.stars = new String[92][7];
    this.sun = new String[14246][15];
    this.moon = new String[14246][15];
    this.venus = new String[14246][15];
    this.march = new String[14246][15];
    this.jupiter = new String[14246][15];
    this.saturn = new String[14246][15];
}


/**
 * Lägger in de tvådimensionella strängvektorerna i en arraylist.
 */
private void putStringsToList() {

    this.stringObjects.add(this.celestObj);
    this.stringObjects.add(this.solarObj);
    this.stringObjects.add(this.stars);
    this.stringObjects.add(this.sun);
    this.stringObjects.add(this.moon);
    this.stringObjects.add(this.venus);
    this.stringObjects.add(this.march);
    this.stringObjects.add(this.jupiter);
    this.stringObjects.add(this.saturn);
}


/**
 * Filnamnen läses in i en strängvektor
 */
private void initializeTextFile() {

    this.textFile = new String[9];

    this.textFile[0] = "celestobj_txt.txt";
    this.textFile[1] = "solarObj_txt.txt";
    this.textFile[2] = "stars_txt.txt";
    this.textFile[3] = "sun_txt.txt";
    this.textFile[4] = "moon_txt.txt";
    this.textFile[5] = "venus_txt.txt";
    this.textFile[6] = "march_txt.txt";
    this.textFile[7] = "jupiter_txt.txt";
    this.textFile[8] = "saturn_txt.txt";
}




    private void read(String text_file, int len, int index) {

    String[] stringBuffer = new String[len]; // temporär textsträng som read-objektet returnerar textraden till.



    BufferedReader br; 

    try {
        InputStream input = assetManager.open(text_file);
        br = new BufferedReader(new InputStreamReader(input, "UTF-8"));
        //bufferedReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(text_file)));
        String line;
        int i = 0;
        while ( (line = br.readLine()) != null) {
            stringBuffer[i] = line; // läs in rader från textfilen
            i++;
        }
        br.close();

    } catch (FileNotFoundException fnde) {
        //fnde.printStackTrace();
        System.out.println("filerna kunde inte hittas");
    } catch (Exception e) {
        e.printStackTrace();
    }

    splitString(stringBuffer, index);   
}


private void splitString(String[] str, int index) {

    int nCols = this.stringObjects.get(index)[0].length; // antal kolumner
    for (int i = 0; i < str.length; i++) {

        StringTokenizer st = new StringTokenizer(str[i]);

        for (int j = 0; j < nCols; j++) {

            this.stringObjects.get(index)[i][j] = st.nextToken();
        }
    }
}

因为要加载的9个文件,这个读取方法被调用9次。这可能是内存泄漏的来源吗?

很高兴回答

编辑:我选择向整个班级展示。再次感谢!!!

1 个答案:

答案 0 :(得分:0)

我认为这是因为你用来存储读取行的String []。你能用StringBuilder而不是String []来试试吗?

// stringBuffer[i] = line;
stringBuilder.append(line);