Exemplo n.º 1
0
  /**
   * Issues a bitmap request with the given URL if that image is not available in the cache, and
   * returns a bitmap container that contains all of the data relating to the request (as well as
   * the default image if the requested image is not available).
   *
   * @param requestUrl The url of the remote image
   * @param imageListener The listener to call when the remote image is loaded
   * @param maxWidth The maximum width of the returned image.
   * @param maxHeight The maximum height of the returned image.
   * @param scaleType The ImageViews ScaleType used to calculate the needed image size.
   * @return A container object that contains all of the properties of the request, as well as the
   *     currently available image (default if remote is not loaded).
   */
  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);

    // 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.addRequest(newRequest);
    mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer));
    return imageContainer;
  }
Exemplo n.º 2
0
  /**
   * Issues a bitmap request with the given URL if that image is not available in the cache, and
   * returns a bitmap container that contains all of the data relating to the request (as well as
   * the default image if the requested image is not available).
   *
   * @param requestUrl The url of the remote image
   * @param imageListener The listener to call when the remote image is loaded
   * @param maxWidth The maximum width of the returned image.
   * @param maxHeight The maximum height of the returned image.
   * @return A container object that contains all of the properties of the request, as well as the
   *     currently available image (default if remote is not loaded).
   */
  public ImageContainer get(
      String requestUrl, ImageListener imageListener, int maxWidth, int maxHeight) {
    // only fulfill requests that were initiated from the main thread.
    throwIfNotOnMainThread();

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

    // 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);

    // 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<?> newRequest =
        new ImageRequest(
            requestUrl,
            new Listener<Bitmap>() {
              @Override
              public void onResponse(Bitmap response) {
                onGetImageSuccess(cacheKey, response);
              }
            },
            maxWidth,
            maxHeight,
            Config.RGB_565,
            new ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                onGetImageError(cacheKey, error);
              }
            },
            mExpiresTime);

    mRequestQueue.add(newRequest);
    mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer));
    return imageContainer;
  }
Exemplo n.º 3
0
 public ImageContainer get(
     String requestUrl, ImageListener imageListener, int maxWidth, int maxHeight) {
   throwIfNotOnMainThread();
   String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight);
   Bitmap cachedBitmap = this.mCache.getBitmap(cacheKey);
   if (cachedBitmap != null) {
     ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null);
     imageListener.onResponse(container, true);
     return container;
   }
   ImageContainer imageContainer = new ImageContainer(null, requestUrl, cacheKey, imageListener);
   imageListener.onResponse(imageContainer, true);
   BatchedImageRequest request = (BatchedImageRequest) this.mInFlightRequests.get(cacheKey);
   if (request != null) {
     request.addContainer(imageContainer);
     return imageContainer;
   }
   Request<Bitmap> newRequest = makeImageRequest(requestUrl, maxWidth, maxHeight, cacheKey);
   this.mRequestQueue.add(newRequest);
   this.mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer));
   return imageContainer;
 }
  /**
   * Pre caches the given set of image urls. We recommend using this method to warm the image cache
   * before calling {@link CustomEventNativeListener#onNativeAdLoaded}. Doing so will force images
   * to cache before displaying the ad.
   */
  static void preCacheImages(
      @NonNull final Context context,
      @NonNull final List<String> imageUrls,
      @NonNull final ImageListener imageListener) {
    final ImageLoader imageLoader = Networking.getImageLoader(context);
    // These Atomics are only accessed on the main thread.
    // We use Atomics here so we can change their values while keeping a reference for the inner
    // class.
    final AtomicInteger imageCounter = new AtomicInteger(imageUrls.size());
    final AtomicBoolean anyFailures = new AtomicBoolean(false);
    ImageLoader.ImageListener volleyImageListener =
        new ImageLoader.ImageListener() {
          @Override
          public void onResponse(
              final ImageLoader.ImageContainer imageContainer, final boolean isImmediate) {
            // Image Loader returns a "default" response immediately. We want to ignore this
            // unless the image is already cached.
            if (imageContainer.getBitmap() != null) {
              final int count = imageCounter.decrementAndGet();
              if (count == 0 && !anyFailures.get()) {
                imageListener.onImagesCached();
              }
            }
          }

          @Override
          public void onErrorResponse(final VolleyError volleyError) {
            MoPubLog.d("Failed to download a native ads image:", volleyError);
            boolean anyPreviousErrors = anyFailures.getAndSet(true);
            imageCounter.decrementAndGet();
            if (!anyPreviousErrors) {
              imageListener.onImagesFailedToCache(NativeErrorCode.IMAGE_DOWNLOAD_FAILURE);
            }
          }
        };

    for (String url : imageUrls) {
      if (TextUtils.isEmpty(url)) {
        anyFailures.set(true);
        imageListener.onImagesFailedToCache(NativeErrorCode.IMAGE_DOWNLOAD_FAILURE);
        return;
      }
      imageLoader.get(url, volleyImageListener);
    }
  }