Как рекурсивно сканировать каталоги в Android

Как я могу рекурсивно сканировать каталоги в Android и отображать имена файлов? Я пытаюсь сканировать, но это медленно (принудительно закрыть или подождать). Я использую FileWalker Класс дан в отдельном ответе на этот вопрос.

3 ответа

Решение

Вы почти всегда должны обращаться к файловой системе только из потока, не являющегося пользовательским интерфейсом. В противном случае вы рискуете заблокировать поток пользовательского интерфейса на длительные периоды и получить ANR. Запустите FileWalker в AsyncTask"s doInBackground(),

Это слегка оптимизированная версия FileWalker:

public class Filewalker {

    public void walk(File root) {

        File[] list = root.listFiles();

        for (File f : list) {
            if (f.isDirectory()) {
                Log.d("", "Dir: " + f.getAbsoluteFile());
                walk(f);
            }
            else {
                Log.d("", "File: " + f.getAbsoluteFile());
            }
        }
    }   
}

Вы можете вызвать его из фонового потока следующим образом:

Filewalker fw = new Filewalker();
fw.walk(context.getFilesDir());

System.out.println вызовы очень медленные (ну, на самом деле это не сама функция, а базовый PrintStream, который занимает много времени для написания текста в консоли).

Замените их чем-то другим, и все должно быть в порядке. Например, вы можете создать и вернуть массив с именами файлов.

Если вы предпочитаете нерекурсивный метод, вы можете попробовать что-то вроде:

      public void filetree (File directory)
{
    List<File> dirlist = new ArrayList<File>();  // The list of directories to scan
    dirlist.add(directory);     // Initialize - with the stating point
    do {            // The scan list cannot start with zero entries - so bottom exit
        File f = dirlist.remove(0);     // Extract the directory to scan
        if (f.listFiles() != null)      // Check for permissions problems
            for (File fl : f.listFiles())
                if (fl.isDirectory()) dirlist.add(fl.getAbsoluteFile());    // directory - add to list
                else Log.i ("msg", "File: " + fl.getAbsoluteFile());  // File - do something with it
    } while (!dirlist.isEmpty());  // Continue until there is nothing left to scan
}
Другие вопросы по тегам