Android上SD卡的快速扫描

Android上SD卡的快速扫描,android,performance,mediastore,Android,Performance,Mediastore,我试图写一个算法,以最快的速度扫描整个SD卡。我试图实现的是QuickPic,它具有“正常速度”的SD卡初始扫描,但任何后续刷新都非常快 我已经尝试了好几件事,我还有一些想法我还没有测试过 1) 始终扫描整个SD卡。我试过这个…在初始扫描时有点慢。但所有后续扫描速度都更快,但不如QucikPic快 2) 初始扫描后,将FileObserver添加到所有文件夹。虽然它只增加了应用程序的内存约1MB,但我担心这会影响性能,甚至耗尽电池电量,因为它必须一直运行。另外,我在SD卡上有数据库,我不断地得到

我试图写一个算法,以最快的速度扫描整个SD卡。我试图实现的是QuickPic,它具有“正常速度”的SD卡初始扫描,但任何后续刷新都非常快

我已经尝试了好几件事,我还有一些想法我还没有测试过

1) 始终扫描整个SD卡。我试过这个…在初始扫描时有点慢。但所有后续扫描速度都更快,但不如QucikPic快

2) 初始扫描后,将FileObserver添加到所有文件夹。虽然它只增加了应用程序的内存约1MB,但我担心这会影响性能,甚至耗尽电池电量,因为它必须一直运行。另外,我在SD卡上有数据库,我不断地得到日志文件被创建/删除的事件。我确信,在使用其他应用程序时,我会不断收到其他文件夹/文件的通知。不确定这在性能方面是否正常

3) 使用MediaStore中的数据。不幸的是,在我的HTC Desire Media store上,SD卡上的内容似乎并不总是最新的(不知道为什么),但这还不够好

3) 使用ContentObserver。我还没有尝试过这个,必须检查文档,但我有一种感觉,如果MediaStore的数据库中没有图像,那么我也不会从ContentObserver获得它


你们还有别的建议吗?基本上,我需要的是了解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