据我所知,universal-image-loader 提供了两种显示图像的方法。imageLoader.loadImage 和 imageLoader.displayImage。但是这两种方法必须绑定到 UI 元素才能显示。我可以只下载文件以在线程中缓存(以供将来显示)。我现在不需要显示这些图像。
5 回答
您仍然可以使用UIL
. 根据displayOptions
下面使用的图像将被缓存。
请参阅此处 - https://github.com/nostra13/Android-Universal-Image-Loader
// 加载图片,解码为Bitmap,返回Bitmap回调
imageLoader.loadImage(imageUri, displayOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// Do whatever you want with Bitmap
}
});
我可以只下载文件以在线程中缓存(以供将来显示)。我现在不需要显示这些图像。
您可以使用 Executor 或创建线程来下载文件。您不需要使用通用图像加载器。
http://developer.android.com/reference/java/util/concurrent/Executor.html。
您还可以使用 DownloadManager 并将文件保存在 sdcard 中。您可以检索相同的内容以供以后使用。
要缓存位图,您可以将图像写入 sdcard 中的文件夹。
缓存位图
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html。
您将位图缓存在内存或磁盘中。该链接包含有关该主题的详细信息。
您基本上使用 UIL ofr 在 listview 或 grdiview 中显示图像。要在列表视图或网格视图中使用 UIL,您可以执行以下操作。
https://github.com/nostra13/Android-Universal-Image-Loader。它基于惰性列表(工作原理相同)。但它还有很多其他配置。如果下载失败,您可以显示错误图像。可以显示带圆角的图像。可以缓存在磁盘或内存上。可以压缩图像。
在您的自定义适配器构造函数中
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
在你的 getView()
ImageView image=(ImageView)vi.findViewById(R.id.imageview);
imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options
您可以配置其他选项以满足您的需求。
与延迟加载/通用图像加载器一起,您可以查看持有者以实现平滑滚动和性能。http://developer.android.com/training/improving-layouts/smooth-scrolling.html。
Theres loadImage(String uri, ImageLoadingListener listener)
,我认为如果你不需要的话,你可以用 null 来调用它。
添加到@Robin Srivastava 的答案:
您还必须实例化ImageLoader
上下文,例如:
imageLoader = ImageLoader.getInstance();
在您可以使用该loadImage
方法之前。该displayOptions
参数也是可选的,因此您可以在需要时排除它。
使用UIL,我们可以在图像完全加载时保存图像。
加载完成后使用 ImageLoading 监听器,监听器有一个方法调用onLoadingComplete()
我们可以获取图像的位图,我们可以使用以下方法存储此位图saveImage()
Bitmap imageBitmap=null;
ImageLoader.getInstance().displayImage(String.valueOf(mediaPath), imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case UNKNOWN:
message = "Unknown error";
break;
case IO_ERROR:
message = "I/O error";
break;
case NETWORK_DENIED:
message = "Network Denied";
break;
case OUT_OF_MEMORY:
message = "Out of memory";
break;
case DECODING_ERROR:
message = "decoding error";
break;
}
Toast.makeText(FullScreenActivity.this, message, Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//we can get imageBitmap here when loading is completed
imageBitmap=loadedImage;
progressBar.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
使用此方法将文件保存在本地存储中
public void saveImage(){
if(imageBitmap!=null){
File dir = new File( Environment.getExternalStorageDirectory().getAbsolutePath() + “/Images/");
if (!dir.exists()) {
if (dir.mkdirs()) {
Log.i(TAG, "Directory created");
}
}
//put your image file name here
File mypath=new File(dir,"yourImageName.png");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(mypath);
// Use the compress method on the BitMap object to write image to the OutputStream
if(imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)){
showToast("Successfully downloaded");
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Toast toast=null;
private void showToast(String message) {
if (toast != null) toast.cancel();
toast = Toast.makeText(FullScreenActivity.this, message, Toast.LENGTH_SHORT);
toast.show();
}