Мое приложение Android должно посмотреть в каталог камеры по умолчанию и получить имена файлов JPEG, созданных в пределах временного диапазона. В настоящее время я делаю это с помощью нижеприведенного фрагмента кода. Идея состоит в том, чтобы отфильтровать файлы не только с помощью расширения «jpg», но также использовать тот факт, что имена файлов имеют дату и время в них.Самый эффективный способ чтения всех файлов в список в Android
Я запускаю нижнюю функцию getImages() в потоке, поэтому сам пользовательский интерфейс не влияет. Я замечаю, что это займет некоторое время, если в каталоге есть много файлов, даже после всего этого. Есть ли более быстрый алгоритм или специальные функции Android, которые я могу использовать, чтобы оптимизировать его дальше?
private boolean getImages()
{
boolean status=true;
File dir = new File(picPath);
//Optimize file search by setting the common file prefix as a filter
//get the date format used by camera to store files.
String startStr=startTime.format3339(false);
String endStr=endTime.format3339(false);
//Loop through each character of start time
//and compare with end time till a mismatch is found
int len=startStr.length();
int idx=0;
for (idx=0;id < len;idx++)
{
if (startStr.charAt(idx) != endStr.charAt(idx))
{
Log.d(TAG,"breaking at idx "+ idx);
break;
}
}
filterString=endStr.substring(0,idx).replace("T", " ").replace(":",".");
Log.d(TAG,"Filter String" + filterString);
String[] children = dir.list(new JpegFilter());
List matchedFiles = new ArrayList();
Log.d(TAG,dir.getAbsolutePath()+" has "+ children.length+ " files");
int numfiles = children.length;
for(int i=0;i < numfiles;i++)
{
//Get file modify time
File file = new File(picPath+File.separator+children[i]);
// Get the last modification information.
long lastModified = file.lastModified();
if (lastModified > =startTime.toMillis(false)) //If file modified date greater than equals start time
{
Log.d(TAG,"Match! " + children[i]);
if (lastModified < =endTime.toMillis(false))//If file modified date less than equals end time
{
matchedFiles.add(picPath+File.separator+children[i]);
}
else //We are now over the time range, quit loop to save time
{
break; //TODO break out of for loop
}
}
}
if (!matchedFiles.isEmpty()) //If there are images to be processed
{
status=convertToPDF(matchedFiles,pdfFile);
Log.d(TAG,"convertToPDF() returned " + status);
}
return status;
}
Это класс фильтра Я использую
class JpegFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return (name.startsWith(captureJPEG.filterString) && name.endsWith(".jpg"));
}
}
Я буду смотреть на него, но и все приложения браузера файлов будет немного более убить. Позвольте мне посмотреть, есть ли какие-нибудь трюки, которые я могу найти там. – SidJ