Как использовать автономный кеширование универсального графического загрузчика?
Можно ли отключиться в автономном режиме с помощью универсального загрузчика изображений?
Если возможно, как его использовать?
Использование конфигураций?
Как установить каталог загрузки вручную?
из памяти 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);
как его решить?
Ответы
Ответ 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);