到目前为止,我无法理解当我将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次。这可能是内存泄漏的来源吗?
很高兴回答
编辑:我选择向整个班级展示。再次感谢!!!答案 0 :(得分:0)
我认为这是因为你用来存储读取行的String []。你能用StringBuilder而不是String []来试试吗?
// stringBuffer[i] = line;
stringBuilder.append(line);