Android上SD卡的快速扫描
我试图写一个算法,以最快的速度扫描整个SD卡。我试图实现的是QuickPic,它具有“正常速度”的SD卡初始扫描,但任何后续刷新都非常快 我已经尝试了好几件事,我还有一些想法我还没有测试过 1) 始终扫描整个SD卡。我试过这个…在初始扫描时有点慢。但所有后续扫描速度都更快,但不如QucikPic快 2) 初始扫描后,将FileObserver添加到所有文件夹。虽然它只增加了应用程序的内存约1MB,但我担心这会影响性能,甚至耗尽电池电量,因为它必须一直运行。另外,我在SD卡上有数据库,我不断地得到日志文件被创建/删除的事件。我确信,在使用其他应用程序时,我会不断收到其他文件夹/文件的通知。不确定这在性能方面是否正常 3) 使用MediaStore中的数据。不幸的是,在我的HTC Desire Media store上,SD卡上的内容似乎并不总是最新的(不知道为什么),但这还不够好 3) 使用ContentObserver。我还没有尝试过这个,必须检查文档,但我有一种感觉,如果MediaStore的数据库中没有图像,那么我也不会从ContentObserver获得它Android上SD卡的快速扫描,android,performance,mediastore,Android,Performance,Mediastore,我试图写一个算法,以最快的速度扫描整个SD卡。我试图实现的是QuickPic,它具有“正常速度”的SD卡初始扫描,但任何后续刷新都非常快 我已经尝试了好几件事,我还有一些想法我还没有测试过 1) 始终扫描整个SD卡。我试过这个…在初始扫描时有点慢。但所有后续扫描速度都更快,但不如QucikPic快 2) 初始扫描后,将FileObserver添加到所有文件夹。虽然它只增加了应用程序的内存约1MB,但我担心这会影响性能,甚至耗尽电池电量,因为它必须一直运行。另外,我在SD卡上有数据库,我不断地得到
你们还有别的建议吗?基本上,我需要的是了解SD卡上的所有图像文件在某个时候。初始扫描可能需要更长的时间,后续扫描应该尽可能快(我知道这取决于SD卡上的文件夹/文件数量),但QuickPic(或不管它做什么)在大约0.6-0.8秒内扫描整个SD卡,我就是不能这么快。像QuickPic这样的真正的应用程序无疑使用MediaStore作为其源。下面是一个在MediaStore中查找所有外部图像文件及其缩略图的示例 请注意,MediaStore中的数据列指的是文件的完整路径
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import androidx.loader.content.CursorLoader;
import java.io.IOException;
import java.util.ArrayList;
class ImageFileInfo
{
ImageFileInfo(String fileFullPath, Bitmap image, Bitmap thumbnail)
{
this.fileFullPath = fileFullPath;
this.image = image;
this.thumbnail = thumbnail;
}
String fileFullPath;
Bitmap image;
Bitmap thumbnail;
}
public class GetImageInfos
{
static ArrayList<ImageFileInfo> getImageInfos(Context context)
{
ArrayList<ImageFileInfo> list = new ArrayList<>();
final String[] cols = {
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context);
loader.setUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
loader.setProjection(cols);
loader.setSelection(null);
loader.setSortOrder(MediaStore.Images.Media.DATA);
Cursor cursor = loader.loadInBackground();
ContentResolver resolver = context.getContentResolver();
for (int i = 0; i < cursor.getCount(); i++)
{
cursor.moveToPosition(i);
int imagePathCol = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
String imagePath = cursor.getString(imagePathCol);
int imageIdCol = cursor.getColumnIndex(MediaStore.Images.Media._ID);
int imageId = cursor.getInt(imageIdCol);
Bitmap image = BitmapFactory.decodeFile(imagePath);
Bitmap thumb = MediaStore.Images.Thumbnails.getThumbnail(
resolver, imageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
list.add(new ImageFileInfo(imagePath, image, thumb));
}
return list;
}
}
导入android.content.ContentResolver;
导入android.content.Context;
导入android.database.Cursor;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.provider.MediaStore;
导入androidx.loader.content.CursorLoader;
导入java.io.IOException;
导入java.util.ArrayList;
类ImageFileInfo
{
ImageFileInfo(字符串文件完整路径、位图图像、位图缩略图)
{
this.fileFullPath=fileFullPath;
这个图像=图像;
this.缩略图=缩略图;
}
字符串fileFullPath;
位图图像;
位图缩略图;
}
公共类GetImageInfos
{
静态ArrayList getImageInfos(上下文)
{
ArrayList=新建ArrayList();
最终字符串[]cols={
MediaStore.Images.Media.\u ID,
MediaStore.Images.Media.DATA};
游标装入器装入器=新游标装入器(上下文);
setUri(MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI);
装载机设置投影(cols);
loader.setSelection(null);
loader.setSortOrder(MediaStore.Images.Media.DATA);
Cursor=loader.loadInBackground();
ContentResolver解析器=context.getContentResolver();
对于(int i=0;i