Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用通用映像加载器脱机缓存?_Android_Universal Image Loader_Offline Caching - Fatal编程技术网

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

Android 如何使用通用映像加载器脱机缓存?,android,universal-image-loader,offline-caching,Android,Universal Image Loader,Offline Caching,是否可以使用通用映像加载程序捕获脱机映像? 如果可能,如何使用它? 使用配置? 如何手动设置下载目录 加载大型图像时内存不足错误: 我的代码: DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() .cacheOnDisc(true).cacheInMemory(true) .imageScaleType(ImageScaleType.IN_SAMPLE_INT

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

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

我的代码:

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);
如何解决此问题?

您可以使用该类自定义磁盘缓存。这包括以下方法:

  • diskCacheExtraOptions()
  • diskCacheSize()
    (以字节为单位)
  • diskCacheFileCount()
  • diskCacheFileNameGenerator()
  • 还有其他一些
或者您可以使用
diskCache(diskCache)
提供一个自定义类来实现脱机缓存

根据中的示例:


但是,如果您重新启动设备或以任何方式清理缓存,它将不会脱机工作,因为缓存的文件将被删除。

要显示脱机图像,您必须将sd卡上的图像下载到特定文件夹中,并从中进行选择,以防脱机。

对此类库了解不多。但您可以使用以下方法下载图像。 只需从异步调用它。任务并传递您的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();
}

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

ImageLoader.getInstance().init(config);
您可以将它们应用于ImageLoader实例。 之后,如果您在应用程序开始时已连接internet,则Universal Image Loader将下载并缓存您的所有图像,并将其缓存在您使用Universal Image Loader library加载这些图像的位置。下次加载相同的图像时,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():

下面是当您要加载图像时如何使用图像加载程序:

ImageLoader.getInstance().displayImage("image url", myImageView,imageOptions);

如果您使用的是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);

所以它离线显示图像?非常感谢,如果我关闭应用程序,然后重新启动,它还会保留缓存的图像吗?它们是使用通用图像加载器保存它们的一种方式吗?@ShobhitPuri这就是此功能的目的。太好了!非常感谢。我如何才能到达图像本地路径?你的意思是说,如果按照@matiash提到的过程操作,图像将在重新启动时被删除。啊!我不知道。这意味着,
通用图像加载器
不能用于离线存储图像。你知道有什么图书馆可以简化这一点吗。另一方面,我必须使用AsyncTask并从所有URL下载图像,然后将其存储在数据库或SD卡上的某个位置。我认为一个库会使这更容易。我想在listview或gridview中使用它,我知道下载方法,我以前也做过,但我想用最简单的方法来解决它。你需要一个永久缓存(脱机支持)。?或者只是想做一个懒散的加载。?
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);