我怎么能用universal-image-loader下载图像

时间:2013-04-15 13:37:15

标签: android universal-image-loader

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

5 个答案:

答案 0 :(得分: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
    }
});

答案 1 :(得分:6)

  

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

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

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

您也可以使用DownloadManager并将文件保存在SD卡中。您可以检索相同内容以供日后使用。

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

要缓存位图,您可以将图像写入SD卡中的文件夹。

缓存位图

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

您将位图缓存在内存或磁盘中。该链接包含有关该主题的详细信息。

你基本上使用UIL ofr在listview或grdiview中显示图像。要在listview或gridview中使用UIL,您可以执行以下操作。

https://github.com/nostra13/Android-Universal-Image-Loader。它基于Lazy List(基于相同的原理)。但它有很多其他配置。如果下载失败,您可以显示错误图像。可以显示带圆角的图像。可以缓存在光盘或内存上。可压缩图像。

在自定义适配器构造函数

 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

答案 2 :(得分:2)

Theres loadImage(String uri, ImageLoadingListener listener),我认为如果您不需要,可以为侦听器调用null。

答案 3 :(得分:0)

添加@Robin Srivastava的答案:

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

答案 4 :(得分: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();
}