所以伙计们,这是一个很大的问题
我目前正在开发一个涉及大数据库创建的应用程序。
Basicalls它的作用是扫描整个设备以查找任何类型的媒体文件并将其添加到数据库中(通过某些文件扩展名进行过滤)。
它目前的方式是使用递归函数扫描设备的文件夹,每次发现文件实际上是文件而不是目录时,我选择的文件扩展名将文件的路径添加到以前创建的ArrayList中仅包含字符串。
这是在AsyncTask中实现的,所以它是在后台完成的
一旦该任务完成,它就将ArrayList传递给另一个负责将这些文件添加到数据库的AsyncTask。出于简单的调整,我只获取了文件的路径,它的名称和存储在其标签中的标题,用于每个条目(简单的sqlite东西),并通过游标适配器在另一个活动中显示ListView中的标题等等(这不是真的在我的情况下的一个问题)
现在它工作得很好,不会崩溃或返回任何不好的东西(我现在正在测试OnePlus One)。
但是我的手机上有一个非常大的音乐库(大约5400首歌曲),这几乎填满了我的整个存储空间。出于某些未知原因,我提到的扫描任务(使用ArrayList)停在大约3000个文件并将ArrayList传递给第二个任务,这显然不是我想要的。
我的猜测是可能存在很大的性能问题,并且使用ArrayList并不是解决此问题的最佳方法。它可能适用于3000以下但高于此数量的文件...
那么你们会建议什么?我的方法缺乏什么,或者我必须尝试完全不同的东西吗?
答案 0 :(得分:2)
您不需要扫描文件夹(也可能是创建媒体文件数据库),您只需使用MediaStore 类
媒体提供程序包含内部和外部存储设备上所有可用媒体的元数据。
例如,这段代码将返回所有可用的音频播放列表
private List<Playlist> getPlayListsList(){
ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
String[] columns = { _ID, NAME };
Cursor playLists = resolver.query(uri, columns, null, null, null);
List<Playlist> result = new ArrayList<>();
if (playLists == null) {
return result;
}
Cursor cursor;
for (boolean hasItem = playLists.moveToFirst(); hasItem; hasItem = playLists.moveToNext()) {
long id = playLists.getLong(playLists.getColumnIndex(_ID));
String name = playLists.getString(playLists.getColumnIndex(NAME));
cursor = resolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external", id),
new String[]{MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members.ARTIST,
MediaStore.Audio.Media.DATA, MediaStore.Audio.Playlists.Members.PLAY_ORDER}, null, null, null
);
int songsCount = cursor.getCount();
result.add( new Playlist(
id,
name,
songsCount));
cursor.close();
}
playLists.close();
return result;
}