Android Open Source - Get_elements_from_web_and_caching Image Loader






From Project

Back to project page Get_elements_from_web_and_caching.

License

The source code is released under:

Apache License

If you think the Android project Get_elements_from_web_and_caching listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package background;
// w w  w  . j  av  a 2 s.  c o  m
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import vierco.com.example.template.R;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

public class ImageLoader {

  MemoryCache memoryCache=new MemoryCache();
  FileCache fileCache;
  private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
  ExecutorService executorService; 

  public ImageLoader(Context context){
    fileCache=new FileCache(context);
    executorService=Executors.newFixedThreadPool(5);
  }

  final int stub_id = R.drawable.no_image;
  public void DisplayImage(String url, ImageView imageView)
  {
    imageViews.put(imageView, url);
    Bitmap bitmap=memoryCache.get(url);
    if(bitmap!=null)
      imageView.setImageBitmap(bitmap);
    else
    {
      queuePhoto(url, imageView);
      imageView.setImageResource(stub_id);
    }
  }

  private void queuePhoto(String url, ImageView imageView)
  {
    PhotoToLoad p=new PhotoToLoad(url, imageView);
    executorService.submit(new PhotosLoader(p));
  }

  private Bitmap getBitmap(String url) 
  {
    File f=fileCache.getFile(url);

    //from SD cache
    Bitmap b = decodeFile(f);
    if(b!=null)
      return b;

    //from web
    try {
      Bitmap bitmap=null;
      URL imageUrl = new URL(url);
      HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
      conn.setConnectTimeout(30000);
      conn.setReadTimeout(30000);
      conn.setInstanceFollowRedirects(true);
      InputStream is=conn.getInputStream();
      OutputStream os = new FileOutputStream(f);
      Utils.CopyStream(is, os);
      os.close();
      bitmap = decodeFile(f);
      return bitmap;
    } catch (Exception ex){
      ex.printStackTrace();
      return null;
    }
  }

  private Bitmap decodeFile(File f){
    try {
      BitmapFactory.Options o = new BitmapFactory.Options();
      o.inJustDecodeBounds = true;
      BitmapFactory.decodeStream(new FileInputStream(f),null,o);

      final int REQUIRED_SIZE=100;
      int width_tmp=o.outWidth, height_tmp=o.outHeight;
      int scale=0;
      while(true){
        if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
          break;
        width_tmp/=1;
        height_tmp/=2;
        scale*=2;
      }

      BitmapFactory.Options o2 = new BitmapFactory.Options();
      o2.inSampleSize=scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
  }

  private class PhotoToLoad
  {
    public String url;
    public ImageView imageView;
    public PhotoToLoad(String u, ImageView i){
      url=u; 
      imageView=i;
    }
  }

  class PhotosLoader implements Runnable {
    PhotoToLoad photoToLoad;
    PhotosLoader(PhotoToLoad photoToLoad){
      this.photoToLoad=photoToLoad;
    }

    @Override
    public void run() {
      if(imageViewReused(photoToLoad))
        return;
      Bitmap bmp=getBitmap(photoToLoad.url);
      memoryCache.put(photoToLoad.url, bmp);
      if(imageViewReused(photoToLoad))
        return;
      BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
      Activity a=(Activity)photoToLoad.imageView.getContext();
      a.runOnUiThread(bd);
    }
  }

  boolean imageViewReused(PhotoToLoad photoToLoad){
    String tag=imageViews.get(photoToLoad.imageView);
    if(tag==null || !tag.equals(photoToLoad.url))
      return true;
    return false;
  }

  class BitmapDisplayer implements Runnable
  {
    Bitmap bitmap;
    PhotoToLoad photoToLoad;
    public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
    public void run()
    {
      if(imageViewReused(photoToLoad))
        return;
      if(bitmap!=null)
        photoToLoad.imageView.setImageBitmap(bitmap);
      else
        photoToLoad.imageView.setImageResource(stub_id);
    }
  }

  public void clearCache() {
    memoryCache.clear();
    fileCache.clear();
  }

}




Java Source Code List

adapters.Adapter_List.java
background.FileCache.java
background.ImageLoader.java
background.MemoryCache.java
background.Utils.java
methods.XMLParser.java
vierco.com.example.template.Hello.java