This question already has answers here:
How to load an ImageView by URL in Android?
(23 answers)
Closed 9 years ago.
I have Imageview and a link to the picture on the Internet. I set this picture to the ImageView like this,
public ImageView iv;
iv = (ImageView) findViewById(R.id.imageView);
String img = "https://www.google.com/images/srpr/logo11w.png";
iv.setImageDrawable(Drawable.createFromPath(img));
What I want to do is download a picture from the internet to my android application and apply it to an ImageView. I want to make it as easy as possible.
helped me
String img_url= //url of the image
URL url=new URL(img_url);
Bitmap bmp;
bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
ImageView iv=(ImageView)findviewById(R.id.imageview);
iv.setImageBitmap(bmp);
There many libs to do this, my favourite is Picasso.
Here an example of usage:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
give it a try :)
This method create a Drawable from file path name.
Check this answer.
There are many libraries available on doing this, I recommend using a library, because a they have many extra options availble.
Take Universal Image Loader
Features
Multithread image loading
Possibility of wide tuning ImageLoader's configuration (thread executors, downloader, decoder, memory and disc cache, display image options, and others)
Possibility of image caching in memory and/or on device's file system (or SD card)
Possibility to "listen" loading process
Possibility to customize every display image call with separated options
Widget support
Possibility to show an custom Image on loading, error, etc.
You have to set the options one time using:
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisc(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.build();
ImageLoader.getInstance().init(config);
Then, lateron you can use this anywhere in your code:
ImageView iv = (ImageView) findViewById(R.id.imageView);
String str = "http://google.com/img.jpg";
ImageLoader.getInstance().displayImage(str, iv);
Ofcourse there are many other libraries you can use like picasso, Smart Image View, Url Image View and many others.
Related
The user can upload an image and I want to display the image in a listview. This is the code so far:
final String urlForImage = baseUrlForImage + jsonObject.get("imageName");
new DownloadImageTask(cell.imageViewCustomer).execute(urlForImage);
final DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
.cacheOnDisc(true).resetViewBeforeLoading(true)
.showImageForEmptyUri(cell.imageViewCustomer.getDrawable())
.showImageOnFail(cell.imageViewCustomer.getDrawable())
.showImageOnLoading(cell.imageViewCustomer.getDrawable()).build();
imageLoader.displayImage(urlForImage, cell.imageViewCustomer, options);
But now if the user uploads a new image, the older one from the cache will be loaded in the listview and the new image will be loaded every time from the internet.
How can I override the old image from the user, if the user uploads a new image?
This could help you. Cleaning the cache (or a part of) sounds like a good way.
An easy solution is to change the url of the image, just add ?v=1 at the end and increment the number each time the user changes the image.
I am using Universal Image Library for displaying images in Android.
I know using showImageOnLoading(img_id) in DisplayImageOptions allows ImageView to show a Loading Image while image resource is loading.
It works great when I use this option for grabbing images from internet.
However, it is poor when it loads images from cache. It shows the Loading Image just an instant, then shows the Cached Image. It is just a blink.
I don't want a blink and just show the Cached Image only(without the Loading Image) if a cached image exists.
Here is the code I used:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)
.cacheOnDisk(true)
.cacheInMemory(false)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
String url = "http://i2.wp.com/www.fmxexpress.com/wp-content/uploads/2014/02/pullto.jpg";
ImageView image = (ImageView) findViewById(R.id.image);
ImageLoader.getInstance().displayImage(url, image, options);
How could I do that?
I think that blink is caused by the process of reading the file from disk.
What if you just cache the image in memory like this:
.cacheOnDisk(false)
.cacheInMemory(true)
I have a screen with an ImageView containing the actual profile picture. I can edit that profile picture either by taking a picture with the camera or by picking a picture from the sd card. I store the new chosen profile picture under the same path as the old (i overwrite it) which is logical i guess.
However when i set a new profile picture to my ImageView it does not get refreshed. I have to restart the App to see the change.
this.imageView.invalidate();
is what all people are telling me to do when i brows google but no, this is not working! So how can i force my imageview to load the new profile picture?
I load the image into the ImageView with help of Picasso:
Picasso picasso = Picasso.with(context);
if(reload) {
picasso.invalidate(new File(fileName));
}
RequestCreator requestCreator = picasso.load(new File(fileName));
requestCreator.into(imageView);
Picasso caches loaded images to speed up the loading process. This means that if you are trying to reload the same exact picture it loads the cached version and it does not read the changed File from the disk.
You need to tell Picasso that the picture has changed and that it needs to reload the picture from the disk by invalidating the cache. The way you do this is like this:
File file = new File(fileName);
Picasso picasso = Picasso.with(context);
picasso.invalidate(file);
picasso.load(file).into(imageView);
To skip Picasso's cache, you can use .memoryPolicy(MemoryPolicy.NO_CACHE) static method:
Picasso
.with(context)
.load(file)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(imageView);
I want to download images with universal image loader but I do not want it to decode the images and create bitmap from it. I just want to save the original image in a directory. how can I disabling it to decode?
Can I use other libraries? for example picasso but I think it can not do that, am I right?
I think the answer would be:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.NONE)
.build();
because of:
public enum ImageScaleType {
/** Image won't be scaled */
NONE,
from
https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/library/src/com/nostra13/universalimageloader/core/assist/ImageScaleType.java#L24
I can't find in any really credible source explaining what LazyList is. Anyone?
Lazy List is lazy loading of images from sd-card or from server using urls. It is like on demand loading of images.
Images can be cached to a local sd-card or your phone's memory. URL is considered the key. If the key is present in the sd-card, images get displayed from sd-card, otherwise it downloads the image from the server and caches it to a location of your choice. You can set a cache limit. You can also choose your own location to cache images. Cache can also be cleared.
Instead of the user waiting to download large images and then displaying them, lazy list loads images on demand. Since images are cached, you can display images offline.
https://github.com/thest1/LazyList. Lazy List
In your getview
imageLoader.DisplayImage(imageurl, imageview);
ImageLoader Display method
public void DisplayImage(String url, ImageView imageView) //url and imageview as parameters
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url); //get image from cache using url as key
if(bitmap!=null) //if image exists
imageView.setImageBitmap(bitmap); //display iamge
else //downlaod image and dispaly. add to cache.
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
An alternative to Lazy List is Universal Image Loader
https://github.com/nostra13/Android-Universal-Image-Loader. It is based on Lazy List (it works on the same principle), but it has lot of other configurations. I would prefer to use Universal Image Loader because it gives you more configuration options. It can display an error image if a download failed. It can display images with rounded corners. It can cache on disc or memory. It can compress an image.
In your custom adapter constructor
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
In your getView()
ImageView image=(ImageView)vi.findViewById(R.id.imageview);
imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options
You can configure Universal Image Loader with other options to suit your needs.
Along with LazyList/Universal Image Loader you can view this website for smooth scrolling and performance.
http://developer.android.com/training/improving-layouts/smooth-scrolling.html.
AFAIK, I'll explain you with the example
If you list contain lot of images with Text, it will take some time for your list to load because you need to download images and you need to populate them in the list. Suppose if your list contains 100 images It will take lot of time to download each image and to show it the listitem. To make the user wait until the images loads is not user friendly.
so What we need to do. At this point of time lazy list comes into picture. It is the idea that let the images be loaded in background and show text mean while.
Everybody know that listview recycle its views for every view. i.e if your listview contains 40 elemtns then listview won't allocate memory for 40 items instead it allocate memory for the visible items, i.e say you can see only 10 items at a time. so listview will allocate 10 items meemory.
So When ever you scroll the view, then the view will refresh. because of the you'll lose your reference to images and you need to download them agian. in order to avoid that, caching comes into picture.
This example is based on my knowledge in listview, I am not saying this is only correct. There might be wrong in the answer, if any body find feel free to inform me.
I think this is the other way around. AFAIK, Lazy Loading is the definition, where you actually load the data only when you need it, and it's a good design practice.
So I believe the same applies for this, only this time it's being referring to the List View.
If I'm wrong, please correct me.
The best example of lazy list is facebook notifications,messages,requests. when you scroll then data will be load.