深入剖析Android的Volley框架中的图片加载功能

2019-12-10 18:25:44于丽

接下来初始化CacheDispatcher,然后调用start();初始化NetworkDispatcher,然后调用start();

上面的转发器呢,都是线程,可以看到,这里开了几个线程在帮助我们工作,具体的源码,我们一会在看。

好了,到这里,就完成了Volley的初始化的相关代码,那么接下来看初始化ImageLoader相关源码。

(二) 初始化ImageLoader

#VolleyHelper
mImageLoader = new ImageLoader(mReqQueue, new ImageCache()
    {
      private final LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(
          (int) (Runtime.getRuntime().maxMemory() / 10))
      {
        @Override
        protected int sizeOf(String key, Bitmap value)
        {
          return value.getRowBytes() * value.getHeight();
        }
      };

      @Override
      public void putBitmap(String url, Bitmap bitmap)
      {
        mLruCache.put(url, bitmap);
      }

      @Override
      public Bitmap getBitmap(String url)
      {
        return mLruCache.get(url);
      }
    });

#ImageLoader

public ImageLoader(RequestQueue queue, ImageCache imageCache) {
    mRequestQueue = queue;
    mCache = imageCache;
  }

很简单,就是根据我们初始化的RequestQueue和LruCache初始化了一个ImageLoader。

(三) 加载图片

我们在加载图片时,调用的是:

 # VolleyHelper
 getInstance().getImageLoader().get(url, new ImageLoader.ImageListener());

接下来看get方法:

#ImageLoader
 public ImageContainer get(String requestUrl, final ImageListener listener) {
    return get(requestUrl, listener, 0, 0);
  }
public ImageContainer get(String requestUrl, ImageListener imageListener,
      int maxWidth, int maxHeight) {
    return get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
  }
public ImageContainer get(String requestUrl, ImageListener imageListener,
      int maxWidth, int maxHeight, ScaleType scaleType) {

    // only fulfill requests that were initiated from the main thread.
    throwIfNotOnMainThread();

    final String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight, scaleType);

    // Try to look up the request in the cache of remote images.
    Bitmap cachedBitmap = mCache.getBitmap(cacheKey);
    if (cachedBitmap != null) {
      // Return the cached bitmap.
      ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null);
      imageListener.onResponse(container, true);
      return container;
    }

    // The bitmap did not exist in the cache, fetch it!
    ImageContainer imageContainer =
        new ImageContainer(null, requestUrl, cacheKey, imageListener);

    // Update the caller to let them know that they should use the default bitmap.
    imageListener.onResponse(imageContainer, true);

    // Check to see if a request is already in-flight.
    BatchedImageRequest request = mInFlightRequests.get(cacheKey);
    if (request != null) {
      // If it is, add this request to the list of listeners.
      request.addContainer(imageContainer);
      return imageContainer;
    }

    // The request is not already in flight. Send the new request to the network and
    // track it.
    Request<Bitmap> newRequest = makeImageRequest(requestUrl, maxWidth, maxHeight, scaleType,
        cacheKey);

    mRequestQueue.add(newRequest);
    mInFlightRequests.put(cacheKey,
        new BatchedImageRequest(newRequest, imageContainer));
    return imageContainer;
  }