2016-04-26 10 views
0

私はアンドロイドファイルブラウザプロジェクトで作業しています。そこには、TabLayoutの下に4つのフラグメントがあります。 4つのフラグメントは、それぞれイメージ、ビデオ、オーディオ、およびドキュメント用です。ファイルを解読した後、関連するフラグメントリサイクルビューに表示されます。画像ファイルのようなものは画像断片(タブ)のリサイクルビューに読み込まれます。ファイルブラウザのアプリケーションに遅いファイルがロードされています

コード:

private class loader extends AsyncTask<Void,Void,Void> { 

    private Context ctx; 
    private loader(Context ctx){ 
     this.ctx=ctx; 
    } 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progress.setMessage("Loading.."); 
     progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progress.setIndeterminate(true); 
     progress.show(); 


    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     getfile(root); 


     return null; 
    } 
    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     try{ 
     if(progress!=null&&progress.isShowing()){ 
      //progress.cancel(); 
      progress.dismiss(); 
     }} catch (final IllegalArgumentException e) { 
    } catch (final Exception e) { 
    } finally { 
     progress = null; 
    } 

    pager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(pager); 

    } 

} 

private void getfile(File dir) { 
    File listFile[] = dir.listFiles(); 
    if (listFile != null && listFile.length > 0) { 
     for (int i = 0; i < listFile.length; i++) { 

      if (listFile[i].isDirectory()) { 
       //     fileList.add(listFile[i]); 
       getfile(listFile[i]); 

      } else { 
       if (listFile[i].getName().endsWith(".jpg")||listFile[i].getName().endsWith(".png")||listFile[i].getName().endsWith(".jpeg")) 
       { 
        imageset.add(listFile[i].toString()); 
       } 
       if (listFile[i].getName().endsWith(".mp4")||listFile[i].getName().endsWith(".avi")||listFile[i].getName().endsWith(".3gp")) 
       { 
          videoset.add(listFile[i].toString()); 

       } 
       if (listFile[i].getName().endsWith(".mp3")) 
       { 
         audioset.add(listFile[i].toString()); 

       } 
       if (listFile[i].getName().endsWith(".pdf") 
         || listFile[i].getName().endsWith(".doc") 
         || listFile[i].getName().endsWith(".docx") 
         || listFile[i].getName().endsWith(".txt")) 

       { 
         fileset.add(listFile[i].toString()); 

       } 


      } 

     } 
    } 
} 

コードが正常に動作しています。ファイルを読み込む際のパフォーマンスは、数少ないデバイスでは遅く、少数のデバイスでは高速です。アクティビティが開始するたびにロードされ、画面が回転するたびにロードされます。私はアクティビティが始まるたびにロードすることは望ましくありません。私はファイルを高速に読み込めるようにファイルをDBに置くことを考えました。新しいファイルが追加されるたびにDBが自動的に更新される方法はありません。だからこれを達成するための最良の方法は何ですか?

UPDATE:

 private void getFile(File dir) { 

    File[] listFile = dir.listFiles(new FilenameFilter() { 
     @Override 
     public boolean accept(File dir, String filename) { 

      Log.d("FILENAME", filename); 

      if (dir.isDirectory()) { 
       getFile(dir); 
       return false; 
      } 
      String name = dir.getName(); 
      if (name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".jpeg")) 
      { 
       imageset.add(name); 
      } 
      if (name.endsWith(".3gp") || name.endsWith(".avi") || name.endsWith(".mp4")) 
      { 
       videoset.add(name); 
      } 
      if (name.endsWith(".mp3")) 
      { 
       audioset.add(name); 
      } 
      if (name.endsWith(".txt") || name.endsWith(".doc") || name.endsWith(".docx")||name.endsWith(".pdf")) 
      { 
       fileset.add(name); 
      } 

      return false; 
     } 
    }); 

    for(File f : listFile){ System.out.println(f.getName()); } 
} 

答えて

1

あなたのコードでは、複数の点で非常に非効率的である:

  1. あなたはローカル変数を使用しないでください。 listFile[i]listFile[i].getName()を呼び出すには何十時間もかかりません。

  2. ファイルの完全なファイルを取得してから、ファイルを取得するときに直接フィルタリングするのではなく、フィルタリングしています。 FileFilterを実装することでそれを実現できます。 listFilesの戻り値を使用しないため、accept()メソッドはfalseを返します。

    dir.listFiles(new FileFilter() { 
    
        @Override 
        public boolean accept(File pathname) { 
         if (pathname.isDirectory()) { 
          getfile(pathname); 
          return false; 
         } 
         String name = pathname.getName(); 
         if (name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".jpeg") || name.endsWith(".mp4") 
           || name.endsWith(".avi") || name.endsWith(".3gp") || ...) { 
          fileset.add(pathname); 
         } 
         return false; 
        } 
    }); 
    
+0

非常にmuch.Iはあなたが提案したコードを書いた後、印刷してみました、ありがとうございました。このように 'for(File f:listFile){ System.out.println(f.getName()); } '4つのdocファイルしか印刷していません。 – sandesh

+0

再帰検索オプションを追加するために私の答えを編集しました。 – Robert

+0

私はどのように試して更新しました。それは、stackoverflowerrorを投げています。 – sandesh

関連する問題