Я пытаюсь загрузить изображения в растровые изображения, используя 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 отменяет предыдущую displayImage(...)
для того же ImageView.
UIL отменяет предыдущую loadImage(...)
для того же URL-адреса.
Фактически для обоих случаев 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 во время вызова в одно и то же время. Я разработал Custom class, который использует 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); } }