2012-09-17 51 views
0

要求如何在Android優化外部存儲文件搜索

掃描所有文件夾和外部存儲文件中查找所有APK文件,併爲每個APK文件,獲取信息並顯示進度。

我怎麼做的,到目前爲止

我最初的想法是,這是一個簡單的事情來實現。但是,好吧......即使是這樣的作品,它的表現也不如預期。

我使用AsyncTask在後臺執行掃描。這裏是我該怎麼辦:

private ArrayList<String> sdcardAppsPath; 

    protected class ScanTask extends AsyncTask<Context, Scanner, ArrayList<Apk>> { 
    private ArrayList<Apk> sdcardApps; 
    @Override 
     protected ArrayList<App> doInBackground(Context... params) { 

      visitAllDirsAndFiles(Environment.getExternalStorageDirectory()); 
      for (String path : sdcardAppsPath) { 
       //get info about apk file and 
       publishProgress(values) //show in some textviews number of files scanned, total files 
       sdcardApps.add(currentScannedItemFoundInfo); 
      } 
      return sdcardApps 
    } 

    @Override 
     protected void onProgressUpdate(Scanner... values) { 
      super.onProgressUpdate(values); 
      // update some textView texts based on values 
     } 
    } 

而且

// Process all files and directories under dir 
     public void visitAllDirsAndFiles(File dir) { 
      if (dir != null) { 
       if (dir.getAbsoluteFile().toString().endsWith(".apk")) { 
        sdcardAppsPath.add(dir.getAbsoluteFile().toString()); 
       } 

       if (dir.isDirectory()) { 
        String[] children = dir.list(); 
        if (children != null) { 
         for (int i = 0; i < children.length; i++) { 
          visitAllDirsAndFiles(new File(dir, children[i])); 
         } 
        } 
       } 
      } 
     } 

正如你可以看到vistitAllDirsAndFiles後,我得到我所需要的所有APK文件的ArrayList<String>,這樣我就可以檢查每一個我想要的。缺點是,如果卡上有許多文件,並且在找到路徑時應用程序顯示沒有進度,則構建此sdcardAppsPath可能需要很長時間。

我想實現

我希望能夠在doInBackground以某種方式對每個找到的文件,得到我需要的信息,更新進度,然後用掃描繼續什麼。任何想法如何更新我的代碼來這樣工作?

+0

這是完整的代碼清單?你不需要'onProgressUpdate'嗎? –

+0

沒有相關的部分onProgressUpdate ... – Alin

+0

其實,現在我更仔細地看它,如果你想在搜索文件時更新進度,你不應該在你的'visitAllDirsAndFiles'方法中調用'publishProgress'? –

回答

0

我會認爲你想打電話給你的publishProgress方法visitAllDirsAndFiles裏面,如果你想在搜索,而不是事後通過列表迭代,並調用它,然後對文件,更新進度...