是否可以使用通用图像加载器来脱机?如果可能,如何使用它?使用配置?如何手动设置下载目录?
加载巨大图像时内存不足错误:
我的代码:
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);
怎么解决?
您可以使用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();
但是,如果您重新启动设备或清理缓存,它将无法脱机工作,因为缓存的文件将被删除。 要显示离线图像,您必须将SD卡上的图像下载到特定文件夹,并且必须在离线状态下从中选择。
不太了解这样的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();
}
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);
如果您正在使用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);