私はアンドロイドファイルブラウザプロジェクトで作業しています。そこには、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()); }
}
非常にmuch.Iはあなたが提案したコードを書いた後、印刷してみました、ありがとうございました。このように 'for(File f:listFile){ System.out.println(f.getName()); } '4つのdocファイルしか印刷していません。 – sandesh
再帰検索オプションを追加するために私の答えを編集しました。 – Robert
私はどのように試して更新しました。それは、stackoverflowerrorを投げています。 – sandesh