Universal-Image-Loader自定义FileNameGenerator基于本地文件名

时间:2014-10-28 08:38:42

标签: android universal-image-loader

我使用Universal Image Loader来显示从URI下载的图像或已在磁盘缓存实现中可用的图像。

我想要显示音乐专辑封面,但是多个曲目可能具有相同的封面URI(即来自同一专辑的曲目)。我希望即使图像与每次跟踪带有曲目名称的每个不同曲目存储的图像相同,因为我希望用户能够使用自定义曲目替换默认封面,即使对于每个单曲目也是如此。

例如

  • 01 - Track 01.mp3
  • 02 - Track 02.mp3

属于同一张专辑,封面URI为http://something/img.jpg,我想要的磁盘缓存

  • 01 - Track 01.jpg
  • 02 - Track 02.jpg

即使它是相同的图像。

所以我编写了一个FileNameGenerator来为每个Set存储Uri个哈希值,其中哈希值是文件绝对路径的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);
}

但是我处于死胡同,因为我无法理解我正在显示图像的文件,因为生成只将imageURI作为参数,而更多的哈希可以属于同一个uri。

我怎么能绕过这个问题?

1 个答案:

答案 0 :(得分:0)

我想我已经为此找到了解决方案。

每当我调用我的ImageLoader实例来显示图像时,我都会使用

if (uri != null && !uri.isEmpty()) {
    uri = Uri.parse(uri).buildUpon()
        .appendQueryParameter("myhashkeyparameter", "myHashValue").toString();
}
mImageLoader.displayImage(uri,mImageView);

此代码将附加到vaild uri查询参数,uri将变为:

http://someuri/image.jpg?myhashkeyparameter=myHashValue

然后在FileNameGenerator generate方法中我可以使用

String hash = Uri.parse(imageUri).getQueryParameter("myhashkeyparameter");

在不依赖于使用imageUri作为键的情况下检索所需文件。

完整代码:

@Override
public String generate(String imageUri) {
    if(imageUri==null||imageUri.isEmpty()) return "";
    if (imageUri.startsWith("file:///")) {
        return FilenameUtils.removeExtension(Uri.parse(imageUri)
                .getLastPathSegment()) + "."+ext;
    }
    String hash = Uri.parse(imageUri).getQueryParameter("myhashkeyparameter");
    if(null==hash||hash.isEmpty()) return "";
    if(Data.currentFiles.containsKey(hash)){
     return FilenameUtils.removeExtension(Data.currentFiles.get(hash).getName())+".png";
    }
    else return "";
}

您必须要小心,http网址中尚未使用用作查询参数的字符串,因此请避免使用名称,哈希,h,标题等传统名称。