【发布时间】:2014-12-23 14:17:57
【问题描述】:
我正在使用通用图像加载器来显示从 URI 下载的图像或已在磁盘缓存实现中可用的图像。
我想显示音乐专辑封面,但多个曲目可能具有相同的封面 URI(即来自同一专辑的曲目)。即使图像相同,我也希望每次都为每个不同的轨道存储带有轨道名称的图像,因为我希望用户能够用自定义封面替换默认封面,即使对于每个单独的轨道也是如此。
例如
- 01 - 曲目 01.mp3
- 02 - 曲目 02.mp3
属于同一张专辑,封面URI是http://something/img.jpg,磁盘缓存上我想拥有
- 01 - 曲目 01.jpg
- 02 - 曲目 02.jpg
即使是同一张图片。
所以我编写了一个FileNameGenerator,它为每个Uri 存储了一个Set 的哈希值,其中哈希值是文件绝对路径的SHA-1。
这是我的实现:
public MyFileNameGenerator(String ext) {
super();
this.ext = ext;
}
HashMap<String,HashSet<String>> names = new HashMap<String, HashSet<String>>();
@Override
public String generate(String imageUri) {
if(imageUri==null) return null;
if (imageUri.startsWith("file:///")) {
return FilenameUtils.removeExtension(Uri.parse(imageUri)
.getLastPathSegment()) + "."+ext;
}
//How to recognize the correct hash?
//return FilenameUtils.removeExtension(Data.currentFiles
// .get(names.get(imageUri)).getName()) + "." + ext;
}
public void setTrackData(String uri, String hash) {
if(!names.containsKey(uri))
names.put(uri, new HashSet<String>());
names.get(uri).add(hash);
}
但我走入了死胡同,因为无法理解我正在为哪个文件显示图像,因为 generate 仅将 imageURI 作为参数,并且更多哈希可以属于同一个 uri。
我该如何规避这个问题?
【问题讨论】:
-
我不太清楚,所以您希望 track_name.mp3 作为哈希的键,而 track_name.jpg 作为值?如果是这种情况,只需将album_name添加到键[album_name_terack_name.mp3=track_name.jpg],这样就可以区分同名的曲目,相同的值没有问题
-
@Yazan 没有。两个不同的文件可以有相同的图像uri(即相同的专辑封面),我为每个uri存储一组哈希,哈希是mp3文件绝对路径的SHA1,这样我就知道给定的uri被某些文件使用.调用 generate 时,它应该返回 mp3 的名称,但带有 png 扩展名。但是由于
generate只将uri 作为参数,我怎么知道我正在为哪个文件显示图像?换句话说,同一个 URI 应该根据我为其显示封面的文件加载不同的图像。 -
好的,为什么不反过来使用呢?使用 track_name.mp3 作为 key,这样,除非用户更改图像,否则哈希可以相同(具有相同的图像),因此名为 (track_name.mp3) 的条目将具有新的哈希(图像)
-
@Yazan 因为 generate 有 uri 作为参数,所以 uri 是关键,使用 uri 的文件是值。
-
好的,我现在明白了,抱歉我意识到它与图像加载器有关 :)
标签: android universal-image-loader