Android - Volley的ImageLoader下载图片
jopen
9年前
使用Volley的ImageLoader下载图片时, onResponse会调用两次, 第一次Bitmap是空, 设置默认图片; 第二次是下载的网络图片.
源码中:
// Update the caller to let them know that they should use the default bitmap. imageListener.onResponse(imageContainer, true);
使用时, 在加载图片之前, 需要判断Bitmap是否为空, 再加载.
代码
/** * 从服务器下载图片 * onResponse会调用两次, 第一次Bitmap是null, 设置默认图片; 第二次是网络图片. * * @param listener 接收监听 */ protected void parseImage(final ImageListener<Bitmap> listener) { WebScheduler.getInstance().getImageLoader().get(NetworkHelper.getRealUrl(mImgUrl), new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) { mImgBitmap = imageContainer.getBitmap(); if (mImgBitmap != null) listener.onResponse(mImgBitmap); } @Override public void onErrorResponse(VolleyError volleyError) { ToastHelper.getInstance().showToast(R.string.network_error); } }, 0, 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, 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; }
来自: http://blog.csdn.net//caroline_wendy/article/details/47290723