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

时间:2014-09-22 06:59:32

标签: android universal-image-loader offline-caching

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

内存错误导致加载巨大的图片:

我的代码:

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

如何解决?

5 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

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

答案 2 :(得分: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();
}

答案 3 :(得分: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);

答案 4 :(得分: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);