Подтвердить что ты не робот

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

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

из памяти erroron загружает огромные изображения:

мои коды:

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);

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

4b9b3361

Ответ 1

Вы можете использовать класс 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();

Ответ 2

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

Ответ 3

Не знаю много о такой lib. но вы можете использовать следующий метод для загрузки изображений. Просто вызовите его из 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();
}

Ответ 4

Универсальный загрузчик изображений - одна из идеальных библиотек для загрузки асинхронных изображений. Вы можете использовать ответ @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);

Ответ 5

Если вы используете 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);