如何使用通用映像加载器脱机缓存?

问题描述 投票:14回答:5

是否可以使用通用图像加载器来脱机?如果可能,如何使用它?使用配置?如何手动设置下载目录?

加载巨大图像时内存不足错误:

我的代码:

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

怎么解决?

android universal-image-loader offline-caching
5个回答
15
投票

您可以使用ImageLoaderConfiguration.Builder类来自定义磁盘缓存。这包括方法:

  • diskCacheExtraOptions()
  • diskCacheSize()(以字节为单位)。
  • diskCacheFileCount()
  • diskCacheFileNameGenerator()
  • 和其他一些人。

或者您可以使用diskCache(DiskCache)提供实现脱机缓存的自定义类。

Configuration section of the 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();

4
投票

但是,如果您重新启动设备或清理缓存,它将无法脱机工作,因为缓存的文件将被删除。 要显示离线图像,您必须将SD卡上的图像下载到特定文件夹,并且必须在离线状态下从中选择。


3
投票

不太了解这样的lib。但您可以使用以下方法下载图像。只需从异步中调用它即可。任务并传递你的网址。

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

1
投票

Universal Image Loader是一个完美的库,用于加载异步您的图像。您可以使用@matiash answer来设置库配置,然后使用

ImageLoader.getInstance().init(config);

您可以将它们应用于ImageLoader实例。之后,如果您在应用程序开始时连接了Internet,Universal Image Loader将在您使用Universal Image Loader库加载这些图像的位置下载并缓存所有图像。下次加载相同的图像时,Universal Image Loader将从缓存中获取它们,这意味着您不需要任何Internet连接(可以脱机工作)。当有人正在安装你的应用程序并试图第一次开始使用它时,如果他没有互联网连接,就会出现问题。然后Universal Image Loader将尝试从Web服务器加载您的图像并将它们缓存到存储,但由于您没有Internet连接,它将失败。这就是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);

0
投票

如果您正在使用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);
© www.soinside.com 2019 - 2024. All rights reserved.