是否可以使用通用图像加载程序捕获脱机? 如果可能,如何使用它? 使用配置? 如何手动设置下载目录?
内存错误导致加载巨大的图片:
我的代码:
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);
如何解决?
答案 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);