Как использовать автономное кэширование универсального загрузчика изображений?

Можно ли поймать офлайн с помощью универсального загрузчика изображений? Если можно, то как его использовать? С помощью конфигов? Как установить каталог загрузки вручную?

нехватка памяти при загрузке огромных изображений:

мои коды:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheOnDisc(true).cacheInMemory(true)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
            .displayer(new FadeInBitmapDisplayer(300)).build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(G.appConfigs.context)
            .defaultDisplayImageOptions(defaultOptions)
            .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
            .diskCacheExtraOptions(480, 800, null)
            .memoryCache(new WeakMemoryCache())
            .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
            .memoryCacheSize(2 * 1024 * 1024)
            .discCacheSize(300 * 1024 * 1024)
            .build();
    ImageLoader.getInstance().init(config);
    // END - UNIVERSAL IMAGE LOADER SETUP

    ImageLoader imageLoader = ImageLoader.getInstance();

        DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
            .cacheOnDisc(true).resetViewBeforeLoading(true)
            .showImageForEmptyUri(R.drawable.no_pic)
            .showImageOnFail(R.drawable.load_failed)
            .showImageOnLoading(R.drawable.img_thumb).build();

    //download and display image from url
    imageLoader.displayImage(imgURL, img, options);

как это решить?


person Hossein Kurd    schedule 22.09.2014    source источник


Ответы (5)


Вы можете использовать ImageLoaderConfiguration.Builder для настройки кэширования диска. Сюда входят методы:

  • diskCacheExtraOptions()
  • diskCacheSize() (в байтах).
  • diskCacheFileCount()
  • diskCacheFileNameGenerator()
  • и некоторые другие.

Или вы можете просто использовать diskCache(DiskCache), чтобы предоставить собственный класс для реализации автономного кэширования.

Из примера в разделе Конфигурация вики:

File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
    .diskCacheExtraOptions(480, 800, null)
    .taskExecutor(...)
    .taskExecutorForCachedImages(...)
    .threadPoolSize(3) // default
    .threadPriority(Thread.NORM_PRIORITY - 1) // default
    .tasksProcessingOrder(QueueProcessingType.FIFO) // default
    .denyCacheImageMultipleSizesInMemory()
    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
    .memoryCacheSize(2 * 1024 * 1024)
    .memoryCacheSizePercentage(13) // default
    .diskCache(new UnlimitedDiscCache(cacheDir)) // default
    .diskCacheSize(50 * 1024 * 1024)
    .diskCacheFileCount(100)
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
    .imageDownloader(new BaseImageDownloader(context)) // default
    .imageDecoder(new BaseImageDecoder()) // default
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
    .writeDebugLogs()
    .build();
person matiash    schedule 09.11.2014
comment
Так он показывает изображения в автономном режиме? Огромное спасибо - person Hossein Kurd; 10.11.2014
comment
Если я закрою приложение, а затем перезапущу его, сохранятся ли кэшированные изображения? Это способ сохранить их с помощью универсального загрузчика изображений? - person Shobhit Puri; 11.11.2014
comment
@ShobhitPuri В этом цель этой функции. - person matiash; 12.11.2014
comment
Большой! Спасибо большое. - person Shobhit Puri; 12.11.2014
comment
как я могу добраться до локального пути к изображению? - person Hossein Kurd; 18.02.2015

Но если вы в любом случае перезагрузите свое устройство или очистите кеш, он не будет работать в автономном режиме, так как кэшированные файлы будут удалены.
Чтобы показать офлайн-изображения, вы должны загрузить изображения на SD-карту в определенную папку и выбрать из там на всякий случай в офлайне.

person Nitesh    schedule 13.11.2014
comment
Вы хотите сказать, что если следовать процедуре, упомянутой @matiash, изображения будут удалены при перезапуске. Ааа! Не знал этого. - person Shobhit Puri; 14.11.2014
comment
Это означает, что Universal Image Loader нельзя использовать для автономного хранения изображений. Знаете ли вы какую-нибудь библиотеку, которая упростила бы это. В противном случае мне пришлось бы использовать AsyncTask и загружать изображения со всех URL-адресов и либо хранить их в базе данных, либо где-то на SD-карте. Я думал, что библиотека сделает это проще. - person Shobhit Puri; 14.11.2014

Не знаю много о такой библиотеке. но вы можете использовать следующий метод для загрузки изображений. Просто вызовите его из Async. Задача и передать свой URL.

private File root = Environment.getExternalStorageDirectory();
private File dir = new File(root.getAbsolutePath() + "/ImageFolder");

private void downloadFile(String url) throws Exception {
    URL ur = new URL(url);
    String fileName = url.substring(url.lastIndexOf("/") + 1);
    File file = new File(dir, fileName);
    URLConnection uconn = ur.openConnection();
    InputStream is = uconn.getInputStream();
    BufferedInputStream bufferinstream = new BufferedInputStream(is);
    ByteArrayBuffer baf = new ByteArrayBuffer(5000);
    int current = 0;
    while ((current = bufferinstream.read()) != -1) {
        baf.append((byte) current);
    }
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(baf.toByteArray());
    fos.flush();
    fos.close();
}
person Nitesh    schedule 14.11.2014
comment
я хочу использовать его в listview или gridview, я знаю о методах загрузки, и я делал это раньше, но я хочу использовать самый простой способ решить эту проблему. - person Hossein Kurd; 17.02.2015
comment
вам нужен постоянный кеш (автономная поддержка).? или просто хотите сделать ленивую загрузку.? - person Nitesh; 17.02.2015

Universal Image Loader — идеальная библиотека для асинхронной загрузки изображений. Вы можете использовать ответ @matiash для настройки конфигурации библиотеки, а затем с помощью

ImageLoader.getInstance().init(config);

вы можете применить их к экземпляру ImageLoader. После этого, если у вас есть подключение к Интернету в начале вашего приложения, Universal Image Loader загрузит и кэширует все ваши изображения в тех местах, где вы используете загрузку этих изображений с библиотекой Universal Image Loader. В следующий раз, когда вы загрузите те же изображения, Universal Image Loader получит их из кеша, что означает, что вам не нужно подключение к Интернету (может работать в автономном режиме). Проблема возникла, когда кто-то устанавливает ваше приложение и пытается начать использовать его в первый раз, и если у него нет подключения к Интернету. Затем Universal Image Loader попытается загрузить ваши изображения с веб-сервера и кэшировать их в хранилище, но это не удастся, потому что у вас нет подключения к Интернету. Вот почему в Universal Image Loader есть такой класс, как DisplayImageOptions:

new DisplayImageOptions.Builder()

которые позволяют вам настроить, что должно произойти, когда возникает проблема с загрузкой ваших изображений. Вы можете использовать для этой цели такие методы, как:

.showImageOnLoading(R.drawable.default_image)
.showImageForEmptyUri(R.drawable.default_image)
.showImageOnFail(R.drawable.default_image)

Вот пример того, как вы можете его использовать:

DisplayImageOptions imageOptions = new DisplayImageOptions.Builder()
    .showImageOnLoading(getImageLoaderDefaultImage())
    .showImageForEmptyUri(getImageLoaderDefaultImage())
    .showImageOnFail(getImageLoaderDefaultImage())
    .cacheInMemory(true)
    .cacheOnDisk(true)
    .considerExifParams(true)
    .build();

Метод getImageLoaderDefaultImage():

private int getImageLoaderDefaultImage(){ return R.drawable.default_img;}

А вот как использовать Image Loader, когда вы хотите загрузить изображение:

ImageLoader.getInstance().displayImage("image url", myImageView,imageOptions);
person Stoycho Andreev    schedule 07.07.2015

Если вы используете Xamarin: добавьте код ниже в OnCreateView или аналогичный код также доступен в Java.

DisplayImageOptions options = new DisplayImageOptions.Builder().CacheInMemory(true).CacheOnDisk(true).Build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.Context).DefaultDisplayImageOptions(options).Build();
ImageLoader.Instance.Init(config);

Добавьте ниже строку кода при загрузке изображения

ImageLoader imageLoader = ImageLoader.Instance;
imageLoader.DisplayImage(imgURL, imageSource);
person iamguni    schedule 08.01.2017