11

据我所知,universal-image-loader 提供了两种显示图像的方法。imageLoader.loadImage 和 imageLoader.displayImage。但是这两种方法必须绑定到 UI 元素才能显示。我可以只下载文件以在线程中缓存(以供将来显示)。我现在不需要显示这些图像。

4

5 回答 5

12

您仍然可以使用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
    }
});
于 2013-12-23T18:15:04.103 回答
5

我可以只下载文件以在线程中缓存(以供将来显示)。我现在不需要显示这些图像。

您可以使用 Executor 或创建线程来下载文件。您不需要使用通用图像加载器。

http://developer.android.com/reference/java/util/concurrent/Executor.html

您还可以使用 DownloadManager 并将文件保存在 sdcard 中。您可以检索相同的内容以供以后使用。

http://oodlestechnologies.com/blogs/Downloading-and-Retrieving-Files-on-SD-card-in-Android-using-Android-SDK-in-Eclipse

要缓存位图,您可以将图像写入 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

于 2013-04-15T15:30:46.433 回答
2

Theres loadImage(String uri, ImageLoadingListener listener),我认为如果你不需要的话,你可以用 null 来调用它。

于 2013-04-15T13:42:00.853 回答
0

添加到@Robin Srivastava 的答案:

您还必须实例化ImageLoader上下文,例如: imageLoader = ImageLoader.getInstance();在您可以使用该loadImage方法之前。该displayOptions参数也是可选的,因此您可以在需要时排除它。

于 2014-04-28T09:50:09.303 回答
0

使用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();
}
于 2020-05-22T07:50:33.837 回答