Jak korzystać z buforowania offline Universal image loader?

Czy można złapać offline za pomocą universal image loader? Jeśli to możliwe, jak go używać? Używając configs? Jak ręcznie ustawić katalog pobierania?

Out of memory erroron load huge images:

Moje kody:

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);
Jak to rozwiązać ?
Author: AndroSco, 2014-09-22

5 answers

Możesz użyć ImageLoaderConfiguration.Builder klasa do dostosowania buforowania dysku. Obejmuje to metody:

  • diskCacheExtraOptions()
  • diskCacheSize() (w bajtach).
  • diskCacheFileCount()
  • diskCacheFileNameGenerator()
  • I inni.

Lub możesz po prostu użyć diskCache(DiskCache), aby zapewnić niestandardową klasę do implementacji buforowania offline.

Z przykładu w sekcji konfiguracyjnej wiki :

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();
 15
Author: matiash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 14:16:31

Ale jeśli zrestartujesz urządzenie lub wyczyścisz pamięć podręczną mimo to nie będzie działać w trybie offline, ponieważ buforowane pliki zostaną usunięte.
Aby pokazać obrazy offline trzeba pobrać obrazy na kartę sd do określonego folderu i trzeba wybrać stamtąd w przypadku offline.

 4
Author: Nitesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 12:56:00

Nie wiem zbyt wiele o takiej lib. ale możesz użyć następującej metody, aby pobrać swoje obrazy. Po Prostu zadzwoń z asynchronicznego. Zadanie i podaj swój adres 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();
}
 3
Author: Nitesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 08:51:33

Universal Image Loader jest jedną idealną biblioteką do ładowania asynchronicznych obrazów. Możesz użyć @ matiash answer do konfiguracji biblioteki setup, a następnie z

ImageLoader.getInstance().init(config);

Możesz zastosować je do instancji ImageLoader. Następnie, jeśli masz połączenie z Internetem na początku aplikacji, Universal Image Loader pobierze i zbuforuje wszystkie obrazy w miejscach, w których używasz ładowania tych obrazów za pomocą biblioteki Universal Image Loader. Następnym razem, gdy załadujesz te same obrazy, Universal Image Loader pobierze je z pamięci podręcznej, co oznacza, że nie musisz mieć żadnego połączenia z Internetem (może pracować w trybie offline). Problem pojawił się, gdy ktoś instaluje Twoją aplikację i próbuje zacząć z niej korzystać po raz pierwszy, a jeśli nie ma połączenia z Internetem. Następnie Universal Image Loader spróbuje załadować obrazy z serwera WWW i buforować je do pamięci masowej, ale nie powiedzie się, ponieważ nie masz połączenia z Internetem. Dlatego Universal Image Loader ma Klasa jak DisplayImageOptions:

new DisplayImageOptions.Builder()

Które pozwalają ustawić, co powinno się zdarzyć, gdy pojawi się problem z ładowaniem obrazów. Możesz użyć w tym celu metod takich jak:

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

Oto przykład, jak możesz go użyć:

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

Metoda getImageLoaderDefaultImage ():

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

A oto jak używać Image loadera, gdy chcesz załadować obraz:

ImageLoader.getInstance().displayImage("image url", myImageView,imageOptions);
 1
Author: Sniper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 14:20:40

Jeśli używasz Xamarin: dodaj poniższy kod w OnCreateView lub podobny jest dostępny również w Javie.

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

Dodaj poniższy wiersz kodu, podczas wczytywania obrazka

ImageLoader imageLoader = ImageLoader.Instance;
imageLoader.DisplayImage(imgURL, imageSource);
 0
Author: guruitengineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-08 06:55:33