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