I am using universal image loader to load images. The issue is that It does not save loaded images in cache Here is my code.
Map<String, String> headers = new HashMap<String, String>();
headers.put("key", Commons.CURRENT_ACTIVE_PROFILE.getKey());
headers.put("secret", Commons.CURRENT_ACTIVE_PROFILE.getSecret());
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mActivity)
.imageDownloader(new CustomImageDownaloder(mActivity)).build();
//imageLoader.init(ImageLoaderConfiguration.createDefault(mActivity));
imageLoader.init(config);
imageLoader = ImageLoader.getInstance();
displayImageOptions = new DisplayImageOptions.Builder()
.extraForDownloader(headers)
.showImageForEmptyUri(R.drawable.no_preview)
.showImageOnLoading(R.drawable.no_preview)
.showImageOnFail(R.drawable.no_preview)
.cacheInMemory(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
The problem is when I use following line for ImageLoaderCinfiguration that creates a default settings It would work fine and saves the images in cache.
imageLoader.init(ImageLoaderConfiguration.createDefault(mActivity));
But I want to use custom settings for ImageLoaderConfiguration because I am using CustomImageDownloader to pass key/secret with URL. So i use following lines for config
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mActivity)
.imageDownloader(new CustomImageDownaloder(mActivity)).build();
But In this case it doest not save image and if I run the app without internet it does not load the images. Any help/suggestion please?
Possible duplicate I have tried that but no use.
U can use this simple method for Image Loader view
private void initImageLoader() {
// ImageLoader initializing
DisplayImageOptions opts = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(opts).build();
ImageLoader.getInstance().init(config);
}
I have resolved the issue myself. as using
.imageDownloader(new CustomImageDownaloder(mActivity)).build();
would override the default imageDownloader that is
.imageDownloader(new BaseImageDownloader(getApplicationContext())) // default
Default image downloader class contains diffrent methods to load images from web, local storage, assets etc. But the CustomImageDownaloder that i have created only contains code to get stream from web/network. So what I did is to copy and paste all the code of default BaseImageDownloader to CustomImageDownaloder and just modify the
getStreamFromNetwork(String imageUri, Object extra)
according to my requirements.
Related
I have used Universal Image Loader for load image from a server and also getting cached it into memory for fast loading.
But from server side used the same URL for update image.
For eg., www.example.com/xyz.png is URL for the image when they needed to update image they return same URL with a different image.
In this case, Universal Image Loader return image which is previously cached in memory (I think it cached image using its related URL).
So, I needed to Change image if URL returned a different image.
This is my code which I use for load image
DisplayImageOption.java
public class DisplayImageOption {
public static DisplayImageOptions getDisplayImage() {
// .displayer(new RoundedBitmapDisplayer(0))
return new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.icon_place_holder)
.showImageForEmptyUri(R.mipmap.icon_place_holder)
.showImageOnFail(R.mipmap.icon_place_holder)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true).build();
}
public static DisplayImageOptions getDisplayRoundedImage() {
return new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.icon_place_holder)
.showImageForEmptyUri(R.mipmap.icon_place_holder)
.showImageOnFail(R.mipmap.icon_place_holder)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new RoundedBitmapDisplayer(100)).build();
}
}
Code for Image Loading
ImageLoader.getInstance().displayImage(url, imageView, DisplayImageOption.getDisplayImage());
Thanks
In your ImageLoaderConfiguration add diskCache option.
File cacheDir = StorageUtils.getCacheDirectory(context);
long cacheAge = 10L;
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.diskCache(new LimitedAgeDiscCache(cacheDir, cacheAge)) // this will make the cache to remain for 10 seconds only
.build();
Then set it on ImageLoader and display image with your DisplayImageOption
ImageLoader.getInstance().init(config);
ImageLoader.getInstance().displayImage(url, imageView, DisplayImageOption.getDisplayImage());
What it does?
Taken from Android-Universal-Image-Loader
LimitedAgeDiscCache (Size-unlimited cache with limited files' lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.)
And this piece of code is from Android-Universal-Image-Loader's LimitedAgeDiskCache.java class.
/**
* #param cacheDir Directory for file caching
* #param maxAge Max file age (in seconds). If file age will exceed this value then it'll be removed on next
* treatment (and therefore be reloaded).
*/
public LimitedAgeDiskCache(File cacheDir, long maxAge) {
this(cacheDir, null, DefaultConfigurationFactory.createFileNameGenerator(), maxAge);
}
You may like this approach as well.
Use two biblotecas in my application, Universal Image Loader and another that uses the library picasso,
the picasso library, records the image in the cache /cache/picasso-cache/ and the names are generated with the MD5 URL.
To separate the cache Universal Image Loader, I write to /cache/LazyLoad/ and names generated with the item ID.
My code of configuration Universal Image Loader
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.resetViewBeforeLoading(true)
.cacheOnDisk(true)
.cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300))
.build();
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(getApplicationContext());
config.defaultDisplayImageOptions(defaultOptions);
config.memoryCache(new WeakMemoryCache());
config.threadPriority(Thread.NORM_PRIORITY - 2);
config.denyCacheImageMultipleSizesInMemory();
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // for debug
FileNameGenerator fileNameGenerator = new FileNameGenerator() {
#Override
public String generate(String imageUri) {
String fileName = imageUri.substring(imageUri.lastIndexOf('/')+1, imageUri.length());
String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
return fileNameWithoutExtension;
}
};
String pathCache = Globais.getCacheDirImageLazyLoad(mContext); //returns StorageUtils.getCacheDirectory(context, false).getAbsolutePath() + "/lazyload";
File f = new File(pathCache);
if (!f.exists())
f.mkdirs();
DiskCache diskCache = new UnlimitedDiskCache(f, null, fileNameGenerator);
config.diskCache(diskCache);
config.diskCacheFileNameGenerator(fileNameGenerator);
ImageLoader.getInstance().init(config.build());
Problem that after I started using the component that uses the picasso, began to double the cache, ALL images that use the Universal Image Loader, also appear in Picasso's cache.
How can I fix this ???
Anyone have any idea?
I'm using universal image loader in my Android app and it's doing something weird.
I have users and each one of them can have different image profile, what I noticed is that when user 1 replaces his image, the UIL seems to load the old one, when I do this,
imageLoader.displayImage("file://" + profileImgFile, imgview);
it displays some old image, but when I do this
myBitmap = BitmapFactory.decodeFile(profileImgFile.getAbsolutePath(), options);
imgview.setImageBitmap(myBitmap);
it displays the new one.
My UIL setting is below,
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.bitmapConfig(Bitmap.Config.RGB_565).cacheOnDisk(true).cacheInMemory(true).build();
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder( context).defaultDisplayImageOptions(defaultOptions).memoryCache(
new WeakMemoryCache());
ImageLoaderConfiguration config = builder.build();
ImageLoader.getInstance().init(config);
What am I doing wrong?
BTW, I tried removing all the cache settings you see above and it didn't help.
I am using Universal image loader to load images from the url. but images are not getting stored in the cache after loading. can anyone help? this is the code
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.no_pic)
.showImageForEmptyUri(R.drawable.no_pic)
.showImageOnFail(R.drawable.no_pic).cacheInMemory(true)
.considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
c).threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs().build();
// if (!imageLoader.isInited()) {
imageLoader.init(config);
use cache on disk instead of cache on memory
I am using Universal image loader.It is working fine but not decoding few images.
logcat error -Decode returned false
image can't be decoded.
please find below the sample code for the same.
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.iphoneicon_small).cacheInMemory()
.cacheOnDisc().displayer(new RoundedBitmapDisplayer(20))
.build();
imageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration imgconfig = ImageLoaderConfiguration
.createDefault(activity);
imageLoader.init(imgconfig);
imageURL = contacts.get(AndroidJSONParsingActivity.LOGO_IMAGE);
imageLoader.displayImage(Utils.getEncodedUrl(imageURL),
holder.image_logo_icon, options);
In my getview there should be five images but it is loading 3 images and two default image that i set and not from web server.