Android Open Source - Android-Universal-Image-Loader Image Loader






From Project

Back to project page Android-Universal-Image-Loader.

License

The source code is released under:

Apache License

If you think the Android project Android-Universal-Image-Loader 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

/*******************************************************************************
 * Copyright 2011-2014 Sergey Tarasevich
 *//from  ww  w . j ava 2  s  .  com
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package com.nostra13.universalimageloader.core;

import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import com.nostra13.universalimageloader.cache.disc.DiskCache;
import com.nostra13.universalimageloader.cache.memory.MemoryCache;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.FlushedInputStream;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.assist.ViewScaleType;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import com.nostra13.universalimageloader.core.imageaware.NonViewAware;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.utils.ImageSizeUtils;
import com.nostra13.universalimageloader.utils.L;
import com.nostra13.universalimageloader.utils.MemoryCacheUtils;

/**
 * Singletone for image loading and displaying at {@link ImageView ImageViews}<br />
 * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before any other method.
 *
 * @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
 * @since 1.0.0
 */
public class ImageLoader {

  public static final String TAG = ImageLoader.class.getSimpleName();

  static final String LOG_INIT_CONFIG = "Initialize ImageLoader with configuration";
  static final String LOG_DESTROY = "Destroy ImageLoader";
  static final String LOG_LOAD_IMAGE_FROM_MEMORY_CACHE = "Load image from memory cache [%s]";

  private static final String WARNING_RE_INIT_CONFIG = "Try to initialize ImageLoader which had already been initialized before. " + "To re-init ImageLoader with new configuration call ImageLoader.destroy() at first.";
  private static final String ERROR_WRONG_ARGUMENTS = "Wrong arguments were passed to displayImage() method (ImageView reference must not be null)";
  private static final String ERROR_NOT_INIT = "ImageLoader must be init with configuration before using";
  private static final String ERROR_INIT_CONFIG_WITH_NULL = "ImageLoader configuration can not be initialized with null";

  private ImageLoaderConfiguration configuration;
  private ImageLoaderEngine engine;

  private final ImageLoadingListener emptyListener = new SimpleImageLoadingListener();

  private volatile static ImageLoader instance;

  /** Returns singleton class instance */
  public static ImageLoader getInstance() {
    if (instance == null) {
      synchronized (ImageLoader.class) {
        if (instance == null) {
          instance = new ImageLoader();
        }
      }
    }
    return instance;
  }

  protected ImageLoader() {
  }

  /**
   * Initializes ImageLoader instance with configuration.<br />
   * If configurations was set before ( {@link #isInited()} == true) then this method does nothing.<br />
   * To force initialization with new configuration you should {@linkplain #destroy() destroy ImageLoader} at first.
   *
   * @param configuration {@linkplain ImageLoaderConfiguration ImageLoader configuration}
   * @throws IllegalArgumentException if <b>configuration</b> parameter is null
   */
  public synchronized void init(ImageLoaderConfiguration configuration) {
    if (configuration == null) {
      throw new IllegalArgumentException(ERROR_INIT_CONFIG_WITH_NULL);
    }
    if (this.configuration == null) {
      L.d(LOG_INIT_CONFIG);
      engine = new ImageLoaderEngine(configuration);
      this.configuration = configuration;
    } else {
      L.w(WARNING_RE_INIT_CONFIG);
    }
  }

  /**
   * Returns <b>true</b> - if ImageLoader {@linkplain #init(ImageLoaderConfiguration) is initialized with
   * configuration}; <b>false</b> - otherwise
   */
  public boolean isInited() {
    return configuration != null;
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageAware when it's turn. <br/>
   * Default {@linkplain DisplayImageOptions display image options} from {@linkplain ImageLoaderConfiguration
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri        Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageAware {@linkplain com.nostra13.universalimageloader.core.imageaware.ImageAware Image aware view}
   *                   which should display image
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageAware</b> is null
   */
  public void displayImage(String uri, ImageAware imageAware) {
    displayImage(uri, imageAware, null, null, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageAware when it's turn.<br />
   * Default {@linkplain DisplayImageOptions display image options} from {@linkplain ImageLoaderConfiguration
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri        Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageAware {@linkplain com.nostra13.universalimageloader.core.imageaware.ImageAware Image aware view}
   *                   which should display image
   * @param listener   {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on
   *                   UI thread if this method is called on UI thread.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageAware</b> is null
   */
  public void displayImage(String uri, ImageAware imageAware, ImageLoadingListener listener) {
    displayImage(uri, imageAware, null, listener, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageAware when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri        Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageAware {@linkplain com.nostra13.universalimageloader.core.imageaware.ImageAware Image aware view}
   *                   which should display image
   * @param options    {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                   decoding and displaying. If <b>null</b> - default display image options
   *                   {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                   from configuration} will be used.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageAware</b> is null
   */
  public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options) {
    displayImage(uri, imageAware, options, null, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageAware when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri        Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageAware {@linkplain com.nostra13.universalimageloader.core.imageaware.ImageAware Image aware view}
   *                   which should display image
   * @param options    {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                   decoding and displaying. If <b>null</b> - default display image options
   *                   {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                   from configuration} will be used.
   * @param listener   {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on
   *                   UI thread if this method is called on UI thread.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageAware</b> is null
   */
  public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,
      ImageLoadingListener listener) {
    displayImage(uri, imageAware, options, listener, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageAware when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri              Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageAware       {@linkplain com.nostra13.universalimageloader.core.imageaware.ImageAware Image aware view}
   *                         which should display image
   * @param options          {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                         decoding and displaying. If <b>null</b> - default display image options
   *                         {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                         from configuration} will be used.
   * @param listener         {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires
   *                         events on UI thread if this method is called on UI thread.
   * @param progressListener {@linkplain com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener
   *                         Listener} for image loading progress. Listener fires events on UI thread if this method
   *                         is called on UI thread. Caching on disk should be enabled in
   *                         {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions options} to make
   *                         this listener work.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageAware</b> is null
   */
  public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,
      ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
    checkConfiguration();
    if (imageAware == null) {
      throw new IllegalArgumentException(ERROR_WRONG_ARGUMENTS);
    }
    if (listener == null) {
      listener = emptyListener;
    }
    if (options == null) {
      options = configuration.defaultDisplayImageOptions;
    }

    if (TextUtils.isEmpty(uri)) {
      engine.cancelDisplayTaskFor(imageAware);
      listener.onLoadingStarted(uri, imageAware.getWrappedView());
      if (options.shouldShowImageForEmptyUri()) {
        imageAware.setImageDrawable(options.getImageForEmptyUri(configuration.resources));
      } else {
        imageAware.setImageDrawable(null);
      }
      listener.onLoadingComplete(uri, imageAware.getWrappedView(), null);
      return;
    }

    ImageSize targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());
    String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);
    engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);

    listener.onLoadingStarted(uri, imageAware.getWrappedView());

    Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);
    if (bmp != null && !bmp.isRecycled()) {
      L.d(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey);

      if (options.shouldPostProcess()) {
        ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,
            options, listener, progressListener, engine.getLockForUri(uri));
        ProcessAndDisplayImageTask displayTask = new ProcessAndDisplayImageTask(engine, bmp, imageLoadingInfo,
            defineHandler(options));
        if (options.isSyncLoading()) {
          displayTask.run();
        } else {
          engine.submit(displayTask);
        }
      } else {
        options.getDisplayer().display(bmp, imageAware, LoadedFrom.MEMORY_CACHE);
        listener.onLoadingComplete(uri, imageAware.getWrappedView(), bmp);
      }
    } else {
      if (options.shouldShowImageOnLoading()) {
        imageAware.setImageDrawable(options.getImageOnLoading(configuration.resources));
      } else if (options.isResetViewBeforeLoading()) {
        imageAware.setImageDrawable(null);
      }

      ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,
          options, listener, progressListener, engine.getLockForUri(uri));
      LoadAndDisplayImageTask displayTask = new LoadAndDisplayImageTask(engine, imageLoadingInfo,
          defineHandler(options));
      if (options.isSyncLoading()) {
        displayTask.run();
      } else {
        engine.submit(displayTask);
      }
    }
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageView when it's turn. <br/>
   * Default {@linkplain DisplayImageOptions display image options} from {@linkplain ImageLoaderConfiguration
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri       Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageView {@link ImageView} which should display image
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageView</b> is null
   */
  public void displayImage(String uri, ImageView imageView) {
    displayImage(uri, new ImageViewAware(imageView), null, null, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageView when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri       Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageView {@link ImageView} which should display image
   * @param options   {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                  decoding and displaying. If <b>null</b> - default display image options
   *                  {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                  from configuration} will be used.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageView</b> is null
   */
  public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {
    displayImage(uri, new ImageViewAware(imageView), options, null, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageView when it's turn.<br />
   * Default {@linkplain DisplayImageOptions display image options} from {@linkplain ImageLoaderConfiguration
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri       Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageView {@link ImageView} which should display image
   * @param listener  {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on
   *                  UI thread if this method is called on UI thread.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageView</b> is null
   */
  public void displayImage(String uri, ImageView imageView, ImageLoadingListener listener) {
    displayImage(uri, new ImageViewAware(imageView), null, listener, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageView when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri       Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageView {@link ImageView} which should display image
   * @param options   {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                  decoding and displaying. If <b>null</b> - default display image options
   *                  {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                  from configuration} will be used.
   * @param listener  {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on
   *                  UI thread if this method is called on UI thread.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageView</b> is null
   */
  public void displayImage(String uri, ImageView imageView, DisplayImageOptions options,
      ImageLoadingListener listener) {
    displayImage(uri, imageView, options, listener, null);
  }

  /**
   * Adds display image task to execution pool. Image will be set to ImageView when it's turn.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri              Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param imageView        {@link ImageView} which should display image
   * @param options          {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                         decoding and displaying. If <b>null</b> - default display image options
   *                         {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                         from configuration} will be used.
   * @param listener         {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires
   *                         events on UI thread if this method is called on UI thread.
   * @param progressListener {@linkplain com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener
   *                         Listener} for image loading progress. Listener fires events on UI thread if this method
   *                         is called on UI thread. Caching on disk should be enabled in
   *                         {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions options} to make
   *                         this listener work.
   * @throws IllegalStateException    if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @throws IllegalArgumentException if passed <b>imageView</b> is null
   */
  public void displayImage(String uri, ImageView imageView, DisplayImageOptions options,
      ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
    displayImage(uri, new ImageViewAware(imageView), options, listener, progressListener);
  }

  /**
   * Adds load image task to execution pool. Image will be returned with
   * {@link ImageLoadingListener#onLoadingComplete(String, android.view.View, android.graphics.Bitmap)} callback}.
   * <br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri      Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param listener {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on UI
   *                 thread if this method is called on UI thread.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void loadImage(String uri, ImageLoadingListener listener) {
    loadImage(uri, null, null, listener, null);
  }

  /**
   * Adds load image task to execution pool. Image will be returned with
   * {@link ImageLoadingListener#onLoadingComplete(String, android.view.View, android.graphics.Bitmap)} callback}.
   * <br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri             Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param targetImageSize Minimal size for {@link Bitmap} which will be returned in
   *                        {@linkplain ImageLoadingListener#onLoadingComplete(String, android.view.View,
   *                        android.graphics.Bitmap)} callback}. Downloaded image will be decoded
   *                        and scaled to {@link Bitmap} of the size which is <b>equal or larger</b> (usually a bit
   *                        larger) than incoming targetImageSize.
   * @param listener        {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires
   *                        events on UI thread if this method is called on UI thread.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void loadImage(String uri, ImageSize targetImageSize, ImageLoadingListener listener) {
    loadImage(uri, targetImageSize, null, listener, null);
  }

  /**
   * Adds load image task to execution pool. Image will be returned with
   * {@link ImageLoadingListener#onLoadingComplete(String, android.view.View, android.graphics.Bitmap)} callback}.
   * <br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri      Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param options  {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                 decoding and displaying. If <b>null</b> - default display image options
   *                 {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions) from
   *                 configuration} will be used.<br />
   * @param listener {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires events on UI
   *                 thread if this method is called on UI thread.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void loadImage(String uri, DisplayImageOptions options, ImageLoadingListener listener) {
    loadImage(uri, null, options, listener, null);
  }

  /**
   * Adds load image task to execution pool. Image will be returned with
   * {@link ImageLoadingListener#onLoadingComplete(String, android.view.View, android.graphics.Bitmap)} callback}.
   * <br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri             Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param targetImageSize Minimal size for {@link Bitmap} which will be returned in
   *                        {@linkplain ImageLoadingListener#onLoadingComplete(String, android.view.View,
   *                        android.graphics.Bitmap)} callback}. Downloaded image will be decoded
   *                        and scaled to {@link Bitmap} of the size which is <b>equal or larger</b> (usually a bit
   *                        larger) than incoming targetImageSize.
   * @param options         {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                        decoding and displaying. If <b>null</b> - default display image options
   *                        {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                        from configuration} will be used.<br />
   * @param listener        {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires
   *                        events on UI thread if this method is called on UI thread.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
      ImageLoadingListener listener) {
    loadImage(uri, targetImageSize, options, listener, null);
  }

  /**
   * Adds load image task to execution pool. Image will be returned with
   * {@link ImageLoadingListener#onLoadingComplete(String, android.view.View, android.graphics.Bitmap)} callback}.
   * <br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri              Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param targetImageSize  Minimal size for {@link Bitmap} which will be returned in
   *                         {@linkplain ImageLoadingListener#onLoadingComplete(String, android.view.View,
   *                         android.graphics.Bitmap)} callback}. Downloaded image will be decoded
   *                         and scaled to {@link Bitmap} of the size which is <b>equal or larger</b> (usually a bit
   *                         larger) than incoming targetImageSize.
   * @param options          {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                         decoding and displaying. If <b>null</b> - default display image options
   *                         {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                         from configuration} will be used.<br />
   * @param listener         {@linkplain ImageLoadingListener Listener} for image loading process. Listener fires
   *                         events on UI thread if this method is called on UI thread.
   * @param progressListener {@linkplain com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener
   *                         Listener} for image loading progress. Listener fires events on UI thread if this method
   *                         is called on UI thread. Caching on disk should be enabled in
   *                         {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions options} to make
   *                         this listener work.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
      ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
    checkConfiguration();
    if (targetImageSize == null) {
      targetImageSize = configuration.getMaxImageSize();
    }
    if (options == null) {
      options = configuration.defaultDisplayImageOptions;
    }

    NonViewAware imageAware = new NonViewAware(uri, targetImageSize, ViewScaleType.CROP);
    displayImage(uri, imageAware, options, listener, progressListener);
  }

  /**
   * Loads and decodes image synchronously.<br />
   * Default display image options
   * {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions) from
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @return Result image Bitmap. Can be <b>null</b> if image loading/decoding was failed or cancelled.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public Bitmap loadImageSync(String uri) {
    return loadImageSync(uri, null, null);
  }

  /**
   * Loads and decodes image synchronously.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri     Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param options {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                decoding and scaling. If <b>null</b> - default display image options
   *                {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions) from
   *                configuration} will be used.
   * @return Result image Bitmap. Can be <b>null</b> if image loading/decoding was failed or cancelled.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public Bitmap loadImageSync(String uri, DisplayImageOptions options) {
    return loadImageSync(uri, null, options);
  }

  /**
   * Loads and decodes image synchronously.<br />
   * Default display image options
   * {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions) from
   * configuration} will be used.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri             Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param targetImageSize Minimal size for {@link Bitmap} which will be returned. Downloaded image will be decoded
   *                        and scaled to {@link Bitmap} of the size which is <b>equal or larger</b> (usually a bit
   *                        larger) than incoming targetImageSize.
   * @return Result image Bitmap. Can be <b>null</b> if image loading/decoding was failed or cancelled.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public Bitmap loadImageSync(String uri, ImageSize targetImageSize) {
    return loadImageSync(uri, targetImageSize, null);
  }

  /**
   * Loads and decodes image synchronously.<br />
   * <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call
   *
   * @param uri             Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
   * @param targetImageSize Minimal size for {@link Bitmap} which will be returned. Downloaded image will be decoded
   *                        and scaled to {@link Bitmap} of the size which is <b>equal or larger</b> (usually a bit
   *                        larger) than incoming targetImageSize.
   * @param options         {@linkplain com.nostra13.universalimageloader.core.DisplayImageOptions Options} for image
   *                        decoding and scaling. If <b>null</b> - default display image options
   *                        {@linkplain ImageLoaderConfiguration.Builder#defaultDisplayImageOptions(DisplayImageOptions)
   *                        from configuration} will be used.
   * @return Result image Bitmap. Can be <b>null</b> if image loading/decoding was failed or cancelled.
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public Bitmap loadImageSync(String uri, ImageSize targetImageSize, DisplayImageOptions options) {
    if (options == null) {
      options = configuration.defaultDisplayImageOptions;
    }
    options = new DisplayImageOptions.Builder().cloneFrom(options).syncLoading(true).build();

    SyncImageLoadingListener listener = new SyncImageLoadingListener();
    loadImage(uri, targetImageSize, options, listener);
    return listener.getLoadedBitmap();
  }

  /**
   * Checks if ImageLoader's configuration was initialized
   *
   * @throws IllegalStateException if configuration wasn't initialized
   */
  private void checkConfiguration() {
    if (configuration == null) {
      throw new IllegalStateException(ERROR_NOT_INIT);
    }
  }

  /**
   * Returns memory cache
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public MemoryCache getMemoryCache() {
    checkConfiguration();
    return configuration.memoryCache;
  }

  /**
   * Clears memory cache
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void clearMemoryCache() {
    checkConfiguration();
    configuration.memoryCache.clear();
  }

  /**
   * Returns disk cache
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @deprecated Use {@link #getDiskCache()} instead
   */
  @Deprecated
  public DiskCache getDiscCache() {
    return getDiskCache();
  }

  /**
   * Returns disk cache
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public DiskCache getDiskCache() {
    checkConfiguration();
    return configuration.diskCache;
  }

  /**
   * Clears disk cache.
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   * @deprecated Use {@link #clearDiskCache()} instead
   */
  @Deprecated
  public void clearDiscCache() {
    clearDiskCache();
  }

  /**
   * Clears disk cache.
   *
   * @throws IllegalStateException if {@link #init(ImageLoaderConfiguration)} method wasn't called before
   */
  public void clearDiskCache() {
    checkConfiguration();
    configuration.diskCache.clear();
  }

  /**
   * Returns URI of image which is loading at this moment into passed
   * {@link com.nostra13.universalimageloader.core.imageaware.ImageAware ImageAware}
   */
  public String getLoadingUriForView(ImageAware imageAware) {
    return engine.getLoadingUriForView(imageAware);
  }

  /**
   * Returns URI of image which is loading at this moment into passed
   * {@link android.widget.ImageView ImageView}
   */
  public String getLoadingUriForView(ImageView imageView) {
    return engine.getLoadingUriForView(new ImageViewAware(imageView));
  }

  /**
   * Cancel the task of loading and displaying image for passed
   * {@link com.nostra13.universalimageloader.core.imageaware.ImageAware ImageAware}.
   *
   * @param imageAware {@link com.nostra13.universalimageloader.core.imageaware.ImageAware ImageAware} for
   *                   which display task will be cancelled
   */
  public void cancelDisplayTask(ImageAware imageAware) {
    engine.cancelDisplayTaskFor(imageAware);
  }

  /**
   * Cancel the task of loading and displaying image for passed
   * {@link android.widget.ImageView ImageView}.
   *
   * @param imageView {@link android.widget.ImageView ImageView} for which display task will be cancelled
   */
  public void cancelDisplayTask(ImageView imageView) {
    engine.cancelDisplayTaskFor(new ImageViewAware(imageView));
  }

  /**
   * Denies or allows ImageLoader to download images from the network.<br />
   * <br />
   * If downloads are denied and if image isn't cached then
   * {@link ImageLoadingListener#onLoadingFailed(String, View, FailReason)} callback will be fired with
   * {@link FailReason.FailType#NETWORK_DENIED}
   *
   * @param denyNetworkDownloads pass <b>true</b> - to deny engine to download images from the network; <b>false</b> -
   *                             to allow engine to download images from network.
   */
  public void denyNetworkDownloads(boolean denyNetworkDownloads) {
    engine.denyNetworkDownloads(denyNetworkDownloads);
  }

  /**
   * Sets option whether ImageLoader will use {@link FlushedInputStream} for network downloads to handle <a
   * href="http://code.google.com/p/android/issues/detail?id=6066">this known problem</a> or not.
   *
   * @param handleSlowNetwork pass <b>true</b> - to use {@link FlushedInputStream} for network downloads; <b>false</b>
   *                          - otherwise.
   */
  public void handleSlowNetwork(boolean handleSlowNetwork) {
    engine.handleSlowNetwork(handleSlowNetwork);
  }

  /**
   * Pause ImageLoader. All new "load&display" tasks won't be executed until ImageLoader is {@link #resume() resumed}.
   * <br />
   * Already running tasks are not paused.
   */
  public void pause() {
    engine.pause();
  }

  /** Resumes waiting "load&display" tasks */
  public void resume() {
    engine.resume();
  }

  /**
   * Cancels all running and scheduled display image tasks.<br />
   * <b>NOTE:</b> This method doesn't shutdown
   * {@linkplain com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder#taskExecutor(java.util.concurrent.Executor)
   * custom task executors} if you set them.<br />
   * ImageLoader still can be used after calling this method.
   */
  public void stop() {
    engine.stop();
  }

  /**
   * {@linkplain #stop() Stops ImageLoader} and clears current configuration. <br />
   * You can {@linkplain #init(ImageLoaderConfiguration) init} ImageLoader with new configuration after calling this
   * method.
   */
  public void destroy() {
    if (configuration != null) L.d(LOG_DESTROY);
    stop();
    configuration.diskCache.close();
    engine = null;
    configuration = null;
  }

  private static Handler defineHandler(DisplayImageOptions options) {
    Handler handler = options.getHandler();
    if (options.isSyncLoading()) {
      handler = null;
    } else if (handler == null && Looper.myLooper() == Looper.getMainLooper()) {
      handler = new Handler();
    }
    return handler;
  }

  /**
   * Listener which is designed for synchronous image loading.
   *
   * @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
   * @since 1.9.0
   */
  private static class SyncImageLoadingListener extends SimpleImageLoadingListener {

    private Bitmap loadedImage;

    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
      this.loadedImage = loadedImage;
    }

    public Bitmap getLoadedBitmap() {
      return loadedImage;
    }
  }
}




Java Source Code List

com.nostra13.universalimageloader.cache.disc.DiskCache.java
com.nostra13.universalimageloader.cache.disc.impl.BaseDiskCache.java
com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiskCache.java
com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache.java
com.nostra13.universalimageloader.cache.disc.impl.ext.DiskLruCache.java
com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache.java
com.nostra13.universalimageloader.cache.disc.impl.ext.StrictLineReader.java
com.nostra13.universalimageloader.cache.disc.impl.ext.Util.java
com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator.java
com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator.java
com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator.java
com.nostra13.universalimageloader.cache.memory.BaseMemoryCache.java
com.nostra13.universalimageloader.cache.memory.LimitedMemoryCache.java
com.nostra13.universalimageloader.cache.memory.MemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.FIFOLimitedMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.FuzzyKeyMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.LargestLimitedMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.LimitedAgeMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache.java
com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache.java
com.nostra13.universalimageloader.core.DefaultConfigurationFactory.java
com.nostra13.universalimageloader.core.DisplayBitmapTask.java
com.nostra13.universalimageloader.core.DisplayImageOptions.java
com.nostra13.universalimageloader.core.ImageLoaderConfiguration.java
com.nostra13.universalimageloader.core.ImageLoaderEngine.java
com.nostra13.universalimageloader.core.ImageLoader.java
com.nostra13.universalimageloader.core.ImageLoadingInfo.java
com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.java
com.nostra13.universalimageloader.core.ProcessAndDisplayImageTask.java
com.nostra13.universalimageloader.core.assist.ContentLengthInputStream.java
com.nostra13.universalimageloader.core.assist.FailReason.java
com.nostra13.universalimageloader.core.assist.FlushedInputStream.java
com.nostra13.universalimageloader.core.assist.ImageScaleType.java
com.nostra13.universalimageloader.core.assist.ImageSize.java
com.nostra13.universalimageloader.core.assist.LoadedFrom.java
com.nostra13.universalimageloader.core.assist.QueueProcessingType.java
com.nostra13.universalimageloader.core.assist.ViewScaleType.java
com.nostra13.universalimageloader.core.assist.deque.BlockingDeque.java
com.nostra13.universalimageloader.core.assist.deque.Deque.java
com.nostra13.universalimageloader.core.assist.deque.LIFOLinkedBlockingDeque.java
com.nostra13.universalimageloader.core.assist.deque.LinkedBlockingDeque.java
com.nostra13.universalimageloader.core.decode.BaseImageDecoder.java
com.nostra13.universalimageloader.core.decode.ImageDecoder.java
com.nostra13.universalimageloader.core.decode.ImageDecodingInfo.java
com.nostra13.universalimageloader.core.display.BitmapDisplayer.java
com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer.java
com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer.java
com.nostra13.universalimageloader.core.display.RoundedVignetteBitmapDisplayer.java
com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer.java
com.nostra13.universalimageloader.core.download.BaseImageDownloader.java
com.nostra13.universalimageloader.core.download.ImageDownloader.java
com.nostra13.universalimageloader.core.imageaware.ImageAware.java
com.nostra13.universalimageloader.core.imageaware.ImageViewAware.java
com.nostra13.universalimageloader.core.imageaware.NonViewAware.java
com.nostra13.universalimageloader.core.imageaware.ViewAware.java
com.nostra13.universalimageloader.core.listener.ImageLoadingListener.java
com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener.java
com.nostra13.universalimageloader.core.listener.PauseOnScrollListener.java
com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener.java
com.nostra13.universalimageloader.core.process.BitmapProcessor.java
com.nostra13.universalimageloader.sample.Constants.java
com.nostra13.universalimageloader.sample.UILApplication.java
com.nostra13.universalimageloader.sample.activity.ComplexImageActivity.java
com.nostra13.universalimageloader.sample.activity.HomeActivity.java
com.nostra13.universalimageloader.sample.activity.SimpleImageActivity.java
com.nostra13.universalimageloader.sample.fragment.AbsListViewBaseFragment.java
com.nostra13.universalimageloader.sample.fragment.BaseFragment.java
com.nostra13.universalimageloader.sample.fragment.ImageGalleryFragment.java
com.nostra13.universalimageloader.sample.fragment.ImageGridFragment.java
com.nostra13.universalimageloader.sample.fragment.ImageListFragment.java
com.nostra13.universalimageloader.sample.fragment.ImagePagerFragment.java
com.nostra13.universalimageloader.sample.widget.UILWidgetProvider.java
com.nostra13.universalimageloader.utils.DiskCacheUtils.java
com.nostra13.universalimageloader.utils.ImageSizeUtils.java
com.nostra13.universalimageloader.utils.IoUtils.java
com.nostra13.universalimageloader.utils.L.java
com.nostra13.universalimageloader.utils.MemoryCacheUtils.java
com.nostra13.universalimageloader.utils.StorageUtils.java