Glide自定义URI方案

问题描述 投票:0回答:1

我需要从我的数据库加载图像,我将它们存储在blob中就像android一样。每个图像都由我的服装URI表示。我如何使用Glide解决这个问题?

我想从Glide缓存和快速加载中受益。

有没有正确的方法呢?

android android-glide
1个回答
0
投票

您可以通过调用Glide.get(context).register()方法将自定义ModelLoader类注册到Glide。在ModelLoader中,您可以告诉Glide如何通过实现getResourceFetcher方法从数据库加载图像资源并返回自定义DataFetcher实例。

这是一个例子:

DBImageUri类:

public class DBImageUri {

private String uriString;

public DBImageUri(String uriString){
    this.uriString = uriString;
}

@Override
public String toString(){
    return uriString;
}
}

DBDataFetcher类:

public class DBDataFetcher implements DataFetcher<InputStream> {

private DBImageUri uri;
private int width;
private int height;

private InputStream stream;

public DBDataFetcher(DBImageUri uri, int width, int height){
    this.uri = uri;
    this.width = width;
    this.height = height;
}

@Override
public InputStream loadData(Priority priority){
    String uriString = this.uri.toString();

    stream = //**load image based on uri, and return InputStream for this image. this is where you do the actual image from database loading process**;

    return stream;
}

@Override
public String getId(){
    //width & height should be ignored if you return same image resources for any resolution (return uri.toString();)
    return uri.toString() + "_" + width + "_" + height;
}

@Override
public void cleanup(){
    if (stream != null) {
        try {
            stream.close();
        } catch (IOException e) {
            // Ignore
        }
    }
}

@Override
public void cancel(){

}
}

DBModelLoader类:

public class DBModelLoader implements ModelLoader<DBImageUri, InputStream> {

@Override
public DataFetcher<InputStream> getResourceFetcher(DBImageUri model, int width, int height){

    return new DBDataFetcher(model, width, height);
}

public static class Factory implements ModelLoaderFactory<DBImageUri, InputStream>{

    @Override
    public ModelLoader<DBImageUri, InputStream> build(Context context, GenericLoaderFactory factories){
        return new DBModelLoader();
    }

    @Override
    public void teardown(){

    }

}
}

然后通过调用以下方法将ModelLoader添加到Glide注册表:

Glide.get(context).register(DBImageUri.class, InputStream.class, new DBModelLoader.Factory());

现在您可以加载数据库映像:

Glide.with(context).load(new DBImageUri(/*your unique id string for database image*/)).into(imageview);
© www.soinside.com 2019 - 2024. All rights reserved.