private Bitmap prepare(final Bitmap map) { int dstW = request.getRequiredWidth(), dstH = request.getRequiredHeight(); if (dstW <= 0 || dstH <= 0 || request.isSkipScaleBeforeMemCache()) { if (imagesManager.debug) { Log.d( TAG, "Skip scaling for " + request.getKey() + " skip flag: " + request.isSkipScaleBeforeMemCache()); } return map; } final int w = map.getWidth(), h = map.getHeight(); if (w <= dstW && h <= dstH) { return map; } final double ratio = (double) w / h; if (w > h) { dstH = (int) (dstW / ratio); } else { dstW = (int) (dstH * ratio); } if (dstW <= 0 || dstH <= 0) { return map; } final Bitmap scaled = Bitmap.createScaledBitmap(map, dstW, dstH, true); scaled.setDensity(imagesManager.getResources().getDisplayMetrics().densityDpi); return scaled; }
// main thread private void setToConsumer(final ImageConsumer consumer, final ImageResult result) { if (consumer.currentLoader == this) { imagesManager.setResultImage(consumer, result, true); } else { if (imagesManager.debug) { Log.d(TAG, "Skip set for " + consumer); } } }
private void memCacheImage(final ImageResult result) { if (result.getType() != ImageSourceType.MEMORY) { Bitmap input = result.getBitmap(); Bitmap resultBitmap = prepare(input); if (resultBitmap != input) { result.setBitmap(resultBitmap); input.recycle(); } imagesManager.memCacheImage(request.url, resultBitmap); } }
@Override public Void call() { if (imagesManager.debug) { Log.d(TAG, "Start image task"); } try { if (!imagesManager.waitForPause()) { // interrupted cancel(); return null; } final ImageResult result = request.readImage(); if (result == null) { throw new IllegalStateException("Image is not returned!"); } safeImageSet(result); finish(); } catch (final MalformedURLException e) { Log.e(TAG, "Bad URL: " + request.url + ". Loading canceled.", e); error(e); } catch (final IOException e) { if (imagesManager.debug) { Log.e(TAG, "IO error for " + request.url + ": " + e.getMessage()); } error(e); } catch (final Exception e) { Log.e(TAG, "Cannot load image " + request.url, e); error(e); } finally { final boolean removed = imagesManager.currentLoads.remove(request.getKey(), this); if (imagesManager.debug) { Log.d(TAG, "Current loaders count: " + imagesManager.currentLoads.size()); if (!removed) { Log.w(TAG, "Incorrect loader in currents for " + request.getKey()); } } } return null; }
// main thread public boolean addTarget(final ImageConsumer imageHolder) { if (future.isCancelled()) { return false; } // we should start a new task imageHolder.onStart(this, request.url); synchronized (targets) { if (result != null) { imagesManager.setResultImage(imageHolder, result, false); imageHolder.onFinish(request.url, result); } else if (error != null) { imageHolder.onError(request.url, error); } else { imageHolder.currentLoader = this; targets.add(imageHolder); } } return true; }