Android - Volley的ImageLoader下载图片

jopen 8年前

使用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