所以伙计们,这是个大问题
我目前正在开发一个应用程序,其中涉及一个大型数据库的创建。它所做的基本工作是扫描整个设备,寻找任何类型的媒体文件,并将其添加到数据库中(通过特定的文件扩展名过滤)。
它目前的做法是使用递归函数扫描设备的文件夹,每次它找到一个实际上是文件而不是目录的文件,并与我选择的文件扩展名匹配时,它会将该文件的路径添加到之前创建的只包含字符串的ArrayList中。
这是在AsyncTask中实现的,所以它是在后台完成的。
一旦该任务完成,它就会将ArrayList传递给另一个负责将这些文件添加到数据库的AsyncTask。为了简单起见,我只获取了文件的路径、名称和存储在每个条目的标签中的标题(简单的sqlite内容),并通过光标适配器等将标题显示在另一个活动的ListView中(这在我的例子中并不是问题)。
现在它工作得很好,不会崩溃或返回任何不好的东西(我现在正在OnePlus One上测试)。
但我的手机上有一个非常大的音乐库(大约5400首歌曲),几乎填满了我的整个存储空间。出于某种未知的原因,我提到的扫描任务(使用ArrayList)在大约3000个文件时停止,并将ArrayList传递给第二个任务,这显然不是我想要的。
我的猜测是可能会有一个很大的性能问题,使用ArrayList不是解决这个问题的最好方法。它可能适用于低于3000的文件数量,但高于3000也是必要的……
那么你们有什么建议呢?我的方法是否缺少一些东西,或者我必须尝试一些完全不同的东西?
发布于 2015-07-31 20:49:29
你不需要扫描你的文件夹(可能还需要创建媒体文件的数据库),你只需要使用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;
}https://stackoverflow.com/questions/31746143
复制相似问题