在我的Android應用程序中,我將外部存儲的所有路徑填充到數組中。java.lang.StackOverflowError遞歸目錄
少數設備正在報告StackOverflowError。
我讀過many linked posts關於這個問題的原因,但我不知道如何處理它或防止它在我使用的代碼內發生。我也不理解Android可以處理的'遞歸限制'。
以下代碼適用於from this source。
private final Locale loc = SupportedLanguages.isSupported();
private final String CACHE = "cache";
private final String TEMP = "temp";
@Override
protected Boolean doInBackground(Void... params) {
final File fileList = Environment.getExternalStorageDirectory();
final String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
final File[] dirList = fileList.listFiles();
final List<File> listDirs = Arrays.asList(dirList);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
final ArrayList<String> dirPath = new ArrayList<String>();
final ArrayList<String> dirName = new ArrayList<String>();
String fileName = "";
for (final File startingDirectory : listDirs) {
if (!startingDirectory.isFile() && startingDirectory.canRead() && !startingDirectory.isHidden()) {
final List<File> files = getFileListing(startingDirectory);
if (files != null) {
for (final File file : files) {
fileName = file.getPath().replaceAll(absolutePath, "").toLowerCase(loc).replaceAll("\\/", " ")
.trim();
fileName = fileName.replaceAll(" +", " ");
dirName.add(fileName);
dirPath.add(file.toString());
}
}
}
}
}
return true;
}
private List<File> getFileListing(File aStartingDir) {
List<File> result = getFileListingNoSort(aStartingDir);
if (result != null && !result.isEmpty()) {
Collections.sort(result);
}
return result;
}
private List<File> getFileListingNoSort(File aStartingDir) {
List<File> resultArray = new ArrayList<File>();
File[] filesAndDirs = aStartingDir.listFiles();
if (filesAndDirs != null && filesAndDirs.length > 0) {
List<File> filesDirs = Arrays.asList(filesAndDirs);
for (File file : filesDirs) {
if (!file.isFile() && file.canRead() && !file.isHidden() && !file.getName().toLowerCase(loc).startsWith(CACHE)
&& !file.getName().toLowerCase(loc).startsWith(TEMP)) {
resultArray.add(file);
List<File> deeperList = getFileListingNoSort(file);
resultArray.addAll(deeperList);
}
}
}
return resultArray;
}
崩潰日誌:
> Caused by: java.lang.StackOverflowError at
> java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
> at java.lang.StringBuilder.append(StringBuilder.java:216) at
> java.io.File.join(File.java:215) at java.io.File.<init>(File.java:157)
> at java.io.File.<init>(File.java:124) at
> java.io.File.filenamesToFiles(File.java:852) at
> java.io.File.listFiles(File.java:791) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source) at
> com.mypackage.name.ll.a(Unknown Source)
等等......
ProGuard的映射:
com.mypackage.name.GenerateSubDirectoryList -> com.mypackage.name.ll:
java.util.List getFileListingNoSort(java.io.File) -> a
某處,我需要算遞歸併應用一個限制。但我不知道適用於Android或個別設備硬件的位置或限制?
在此先感謝您的幫助。
謝謝安德烈亞斯。是的,問題仍然是這個限制應該設置爲什麼?另外,我看過帖子中超過了'最大整數級別',應該使用長整型。不知道這個限制,我不知道這是否也需要考慮?可能不太可能是由於計數是存儲路徑。感謝您指出符號鏈接 - 我不認爲這一點。我會調查。 – brandall