2016-09-29 5 views
0

Я пытаюсь получить список всех папок, содержащих файлы MP3 во внутреннем хранилище пользователя.Как ускорить доступ к хранилищу файлов?

Вот рекурсивная функция, что я призываю к этой цели -

public void listAllMusicFiles(String pathToDirectory) { 
     String lastFolderPath = ""; 
     int mp3Count = 0; 
     File f = new File(pathToDirectory); 
     File[] files = f.listFiles(); 
     for (File inFile : files) { 
      if (inFile.isDirectory()) { 
       //reset last folder path 
       lastFolderPath = ""; 
       Log.d("Directory ", inFile.getPath()); 
       listAllMusicFiles(inFile.getPath()); 
      } else { 
       if (inFile.getAbsolutePath().endsWith(".mp3") || inFile.getAbsolutePath().endsWith(".MP3")) { 
        mp3Count++; 
        Log.wtf("MP3 Count", mp3Count + " "); 

        //add each folder only once 
        String folderName = inFile.getParentFile().getName(); 
        String folderPath = inFile.getParentFile().getPath(); 
        Log.e("FOUND in", folderPath); 

        //create a new Folder object 
        Folder currentFolder = new Folder(folderName, folderPath, mp3Count + ""); 

        if (!lastFolderPath.equals(folderPath)) { 
         Log.d("NEW", folderPath); 
         lastFolderPath = folderPath; 
         folderArrayList.add(currentFolder); 
        } else { 
         Log.d("OLD", folderPath); 
         //find a Folder object in folderArrayList where the object's path matches current folderPath 
         for (Folder folder : folderArrayList) { 
          String currentPath = folder.getFolder_Path(); 
          if (currentPath.equals(folderPath)) { 
           //found a match 
           //update count 
           folder.setFolder_Song_Count(mp3Count + ""); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

Когда я запускаю этот код на устройстве, я в состоянии перечислить требуемые папки в RecyclerView, но с задержкой около 6-7 секунд.

Я уже перенес эту задачу в AsyncTask, так что мой UIThread не зависает из-за этой интенсивной операции.

Но я совершенно не понимаю, когда дело доходит до улучшения производительности файловой системы. Незлая помощь. Благодаря !

+0

'listAllMusicFiles (String pathToDirectory). Вы конвертируете назад и форт между Sting и File. Сделайте его «listAllMusicFiles (каталог файлов)». – greenapps

+0

'folderName = inFile.getParentFile(). GetName();' Это «f.getName();». – greenapps

+0

Когда в каталоге вы найдете 100 mp3-файлов, вы в 100 раз перебираете список массивов, чтобы увидеть, есть ли эта папка. И затем вы меняете счет для этой папки сто раз. Это не может быть эффективным. Вы должны сначала подсчитать файлы в этой папке. И когда это делается с этой папкой, добавьте имя и пересчитайте один раз в массив. Тогда вам не нужно ничего проверять. – greenapps

ответ

0

Вместо того чтобы хранить currentFolder в ArrayList и на следующем этапе перебора полного списка, чтобы найти эту папку и обновление значения, вы можете просто использовать HashMap как этот

HashMap<String, Folder> folders = new HashMap<>(); 

    public void listAllMusicFiles(String pathToDirectory) { 

     int mp3Count = 0; 
     File f = new File(pathToDirectory); 
     File[] files = f.listFiles(); 

     Folder folder; 
     String folderName, folderPath; 

     for (File inFile : files) { 
      if (inFile.isDirectory()) { 
       //reset last folder path 
       Log.d("Directory ", inFile.getPath()); 
       listAllMusicFiles(inFile.getPath()); 
      } else { 
       if (inFile.getAbsolutePath().endsWith(".mp3") || inFile.getAbsolutePath().endsWith(".MP3")) { 
        mp3Count++; 
        Log.wtf("MP3 Count", mp3Count + " "); 

        //add each folder only once 
        folderName = inFile.getParentFile().getName(); 
        folderPath = inFile.getParentFile().getPath(); 

        Log.e("FOUND in", folderPath); 

        if (folders.containsKey(folderPath)) { 

         folder = folders.get(folderPath); 
         folder.setFolder_Song_Count(mp3Count + ""); 
         folders.put(folderPath, folder); 
        } else { 

         folder = new Folder(folderName, folderPath, mp3Count + ""); 
         folders.put(folderPath, folder); 
        } 

       } 
      } 
     } 
    } 
+0

лучше всего подходит для мультимедиа MediaStore. . –