具有相同URL的Android Universal Image Loader请求被取消

具有相同URL的Android Universal Image Loader请求被取消,android,universal-image-loader,Android,Universal Image Loader,我正在尝试使用UIL将图像加载到位图。我需要加载多个图像,我注意到在某些情况下,图像URL可能是相同的。在这种情况下,只加载第一个图像。如何避免UIL中的请求取消 代码在循环中运行3次: ImageSize targetSize = new ImageSize(70, 70); ImageLoader.getInstance().loadImage("http://icons.iconarchive.com/icons/yellowicon/game-stars/256/Mario-icon.p

我正在尝试使用UIL将图像加载到位图。我需要加载多个图像,我注意到在某些情况下,图像URL可能是相同的。在这种情况下,只加载第一个图像。如何避免UIL中的请求取消

代码在循环中运行3次:

ImageSize targetSize = new ImageSize(70, 70);
ImageLoader.getInstance().loadImage("http://icons.iconarchive.com/icons/yellowicon/game-stars/256/Mario-icon.png", targetSize, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        Log.e("tag", "onLoadingStarted");
    }

    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
         Log.e("tag", "onLoadingFailed");
    }

    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        Log.e("tag", "onLoadingComplete");
    }

    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        Log.e("tag", "onLoadingCancelled");
    }
});
日志包括:

onLoadingStarted
onLoadingStarted
onLoadingStarted
onLoadingComplete
onLoadingCancelled
onLoadingCancelled

UIL取消相同ImageView的上一个
displayImage(…)
任务


UIL取消相同URL的上一个
loadImage(…)
任务

实际上,对于这两种情况,UIL都使用内部的
ImageAware
s进行操作,并比较
ImageAware.getId()
以决定是否取消任务

在您的情况下,为了防止任务取消,您可以这样做:

ImageSize targetSize = new ImageSize(70, 70);
ImageAware imageAware = new NonViewAware(targetSize, ViewScaleType.CROP);
ImageLoader.getInstance().displayImage("http://icons...", imageAware, ...);

嗨,我在同一时间调用几个相同的uri时也遇到了同样的问题。我开发了自定义类,它使用ImageLoader并解决了这个问题

public static MyMusicImageLoader myMusicImageLoader;
public ImageLoader imageLoader;
public Map<String,MImageLoader> mImageLoaderMap = new HashMap<String, MImageLoader>();

public static MyMusicImageLoader getInstance(){
    if(myMusicImageLoader==null)
        myMusicImageLoader = new MyMusicImageLoader();
    return myMusicImageLoader;
}

public MyMusicImageLoader(){
    imageLoader = ImageLoader.getInstance();
}

public void loadImage(final String url,ImageLoadingListener imageLoadingListener){

    MImageLoader mImageLoader = mImageLoaderMap.get(url);
    if(mImageLoader==null){
        mImageLoader = new MImageLoader(url);
        mImageLoader.addImageLoadingListener(imageLoadingListener);
        mImageLoaderMap.put(url,mImageLoader);
        imageLoader.loadImage(url, new SimpleImageLoadingListener(){
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                setAllMImageLoader(url,loadedImage);
            }
        });
    }else{
        mImageLoader.addImageLoadingListener(imageLoadingListener);
    }

}

public void setAllMImageLoader(String url, Bitmap bitmap){
    MImageLoader mImageLoader =  mImageLoaderMap.remove(url);
    ArrayList<ImageLoadingListener> imageLoadingListeners = mImageLoader.imageLoadingListeners;

    for(int i=0; i<imageLoadingListeners.size(); i++){
        ImageLoadingListener imageLoadingListener = imageLoadingListeners.get(i);
        imageLoadingListener.onLoadingComplete("",null,bitmap);
    }

    imageLoadingListeners.clear();

}

class MImageLoader{
    String imageUrl;
    ArrayList<ImageLoadingListener> imageLoadingListeners = new ArrayList<ImageLoadingListener>();
    MImageLoader(String imageUrl){
        this.imageUrl = imageUrl;
    }

    void addImageLoadingListener(ImageLoadingListener imageLoadingListener){
        imageLoadingListeners.add(imageLoadingListener);
    }
}
公共静态MyMusicImageLoader MyMusicImageLoader;
公共图像加载器;
公共映射mImageLoaderMap=newHashMap();
公共静态MyMusicImageLoader getInstance(){
if(myMusicImageLoader==null)
myMusicImageLoader=新的myMusicImageLoader();
返回myMusicImageLoader;
}
公共MyMusicImageLoader(){
imageLoader=imageLoader.getInstance();
}
public void loadImage(最终字符串url,ImageLoadingListener ImageLoadingListener){
MImageLoader=mImageLoaderMap.get(url);
if(mImageLoader==null){
mImageLoader=新的mImageLoader(url);
mImageLoader.addImageLoadingListener(imageLoadingListener);
mImageLoaderMap.put(url,mImageLoader);
loadImage(url,新的SimpleMapgeLoadingListener(){
@凌驾
public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像){
setAllMImageLoader(url,LoadeImage);
}
});
}否则{
mImageLoader.addImageLoadingListener(imageLoadingListener);
}
}
public void setAllMImageLoader(字符串url、位图){
MImageLoader MImageLoader=mImageLoaderMap.remove(url);
ArrayList imageLoadingListeners=mImageLoader.imageLoadingListeners;

对于(int i=0;i将loadImage更改为displayImage,并查看其是否有效。如果您正在加载到同一个imageview,则如果另一个任务正在处理该imageview,则将取消加载,但如何执行:
loadImage(…)
?内部
loadImage(…)
displayImage(…)
使用
非可视软件
。谢谢,这救了我的命。虽然在ImageLoaderConfig中有防止取消的选项会很好。因为我已经多次遇到这个问题,我相信其他人也会遇到。请将算术运算符更改为赋值运算符
ImageAware ImageAware-new Non可视软件(targetSize,ViewScaleType.CROP);