【问题标题】:How To Use universal image loader offline caching?如何使用通用图像加载器离线缓存?
【发布时间】:2014-11-16 01:48:13
【问题描述】:

是否可以使用通用图像加载器进行离线捕捉? 如果可能,如何使用它? 使用配置? 如何手动设置下载目录?

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

我的代码:

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


    【解决方案1】:

    您可以使用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();
    

    【讨论】:

    • 所以它离线显示图像?非常感谢你
    • 如果我关闭应用程序然后重新启动它,它还会保留缓存的图像吗?他们是一种使用通用图像加载器来持久化它们的方法吗?
    • @ShobhitPuri 这就是这个功能的目的。
    • 太棒了!非常感谢。
    • 我如何才能到达图像本地路径?
    【解决方案2】:

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

    【讨论】:

    • 您的意思是说,如果按照@matiash 提到的程序进行操作,图像将在重新启动时被删除。啊!不知道。
    • 这意味着Universal Image Loader不能用于离线存储图像。您知道任何可以简化此操作的库吗?否则,我将不得不使用 AsyncTask 并从所有 URL 下载图像,并将其存储在数据库中或 SD 卡上的某个位置。我认为图书馆会让这更容易。
    【解决方案3】:

    对此类库了解不多。但您可以使用以下方法下载图像。 只需从 Async 调用它。任务并传递您的网址。

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

    【讨论】:

    • 我想在 listview 或 gridview 上使用它,我知道下载方法并且我以前做过,但我想用最简单的方法来解决它。
    • 您需要永久缓存(离线支持)。?或者只是想做一个延迟加载。?
    【解决方案4】:

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

    ImageLoader.getInstance().init(config);
    

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 2014-06-16
        • 2014-11-17
        • 1970-01-01
        • 2023-03-16
        • 2015-06-20
        • 2015-04-02
        • 2016-10-06
        • 2014-06-16
        相关资源
        最近更新 更多