2014-09-22 54 views
14

可以使用通用图像加载器进行离线吗? 如果可能,如何使用它? 使用configs? 如何手动设置下载目录?如何使用通用图像加载器脱机缓存?

内存不足erroron的加载巨大的图像:

我的代码:

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

如何解决呢?

回答

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(); 
+0

因此它显示图片下线?非常感谢你 – AndroSco 2014-11-10 19:18:28

+0

如果我关闭了应用程序,然后重新启动它,它会保持缓存的图像吗?他们是否坚持使用通用图像加载程序? – 2014-11-11 20:35:59

+0

@ShobhitPuri这是此功能的目的。 – matiash 2014-11-11 22:11:18

4

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

+0

你的意思是说,如果你遵循@matiash提到的程序,图像将在重新启动时被删除。啊哈!不知道。 – 2014-11-14 06:42:33

+0

是的,尝试一下。 – Nitesh 2014-11-14 06:49:40

+0

这意味着'Universal Image Loader'不能用于离线存储图像。你知道任何可以简化它的图书馆吗?其他方面,我将不得不使用AsyncTask并从所有URL下载图像,并将其存储在数据库中或SD卡上的某个位置。我认为一个图书馆会让这更容易。 – 2014-11-14 07:01:23

3

不太了解这样的lib。但您可以使用以下方法下载图像。 只需拨打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(); 
} 
+0

我想在listview或gridview中使用它,我知道下载方法,我之前做过,但我想用最简单的方法来解决它。 – AndroSco 2015-02-17 09:58:47

+0

你需要一个永久缓存(离线支持)。 或只是想做一个懒加载。 – Nitesh 2015-02-17 10:06:28

+0

所以我需要listview图像的永久缓存 – AndroSco 2015-02-17 17:45:32

2

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

ImageLoader.getInstance().init(config); 

你可以将它们应用到ImageLoader的实例。 之后,如果您的应用程序开始时连接了互联网,通用图像加载程序将下载并缓存您使用通用图像加载程序库加载这些图像的所有图像。下次您加载相同图像时,通用图像加载程序将从缓存中获取它们,这意味着您不需要任何Internet连接(可以脱机工作)。 当有人安装您的应用程序并尝试首次使用它时,以及他是否没有互联网连接时,问题就出现了。然后通用图像加载程序会尝试从网络服务器加载图像并将其缓存到存储设备,但它会失败,因为您没有互联网连接。这就是为什么通用图像装载机具有像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); 
相关问题