我正在开发一个android filebrowser项目,其中TabLayout下会有四个片段。四个片段分别用于图像,视频,音频和文档。在传输文件后,将显示在相关的片段回收视图中。像图像文件被加载到图像片段(选项卡)的recyclerview中。
代码:
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都无法自动更新。那么实现这一目标的最佳方法是什么?
更新:
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()); }
}
答案 0 :(得分:1)
您的代码在多个点上效率非常低:
您不使用本地变量。几次调用listFile[i]
和listFile[i].getName()
非常低效。
您正在检索文件的完整文件,然后过滤它而不是在检索时直接过滤它。您可以通过实现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;
}
});