private Bitmap decodeWithOOMHandling(URI imageUri) throws IOException {
    Bitmap result = null;
    ImageDecoder decoder = new ImageDecoder(imageUri, downloader, options);
    decoder.setLoggingEnabled(loggingEnabled);
    for (int attempt = 1; attempt <= ATTEMPT_COUNT_TO_DECODE_BITMAP; attempt++) {
      try {
        ViewScaleType viewScaleType = ViewScaleType.fromImageView(imageView);
        result = decoder.decode(targetSize, options.getImageScaleType(), viewScaleType);
      } catch (OutOfMemoryError e) {
        L.e(e);

        switch (attempt) {
          case 1:
            System.gc();
            break;
          case 2:
            configuration.memoryCache.clear();
            System.gc();
            break;
          case 3:
            throw e;
        }
        // Wait some time while GC is working
        SystemClock.sleep(attempt * 1000);
        continue;
      }
      break;
    }
    return result;
  }
  private Bitmap decodeImage(URI imageUri) throws IOException {
    Bitmap bmp = null;

    if (configuration.handleOutOfMemory) {
      bmp = decodeWithOOMHandling(imageUri);
    } else {
      ImageDecoder decoder = new ImageDecoder(imageUri, downloader, options);
      decoder.setLoggingEnabled(loggingEnabled);
      ViewScaleType viewScaleType = ViewScaleType.fromImageView(imageView);
      bmp = decoder.decode(targetSize, options.getImageScaleType(), viewScaleType);
    }
    return bmp;
  }