天天看点

ImageLoader 加载图片                                      ImageLoader 加载图片及注意事项

                                      ImageLoader 加载图片及注意事项

作为android加载图片的开源框架,com.nostra13.universalimageloader.core.ImageLoader给我们提供了很大的方便,但是在使用过程会产生一些问题,下面是我使用过程及其遇到的一些问题。      

一、图片加载

          1、ImageLoader.getInstance().displayImage(url,  imageView);

           参数

         url:可以为网络图片、本地图片图片的路径,也可以是项目中文件路径,还可以是内容提提供者的路径;

                 1)网络图片

                        url = "http://image.zidingyi.com/search/1.png"; 即网络地址。

                  2)本地图片

                        url = "file:///mnt/sdcard/image.png";

                  3)项目中assets文件下图片

                         uri = "assets://image1.png";  

                  4)项目中drawable文件下图片

                         uri = "drawable://" + R.drawable.ic_launcher;

                  5)内容提提供者中的图片

                         uri = "content://media/external/audio/albumart/1";

         imageView:自己定义的ImageView对象;

         从上面可以看出获取图片非常方便,而且都是异步加载。

         2、我们不可以增加监听来判断图片的加载情况

        ImageLoader.getInstance().displayImage(url, this, new ImageLoadingListener() {
    
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    //图片形如加载,可以做一些提示操作
                 }
    
                @Override
                public void onLoadingFailed(String imageUri, View view,FailReason failReason) {
                     //图片加载失败      
                 }
    
                @Override
                 public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                     //图片加载成功,可以再次根据需求对图片进行处理      
                 }
    
                 @Override
                  public void onLoadingCancelled(String imageUri, View view) {
                      //图片加载取消
                   }
              });
          }      

           3、 还可添加参数DisplayImageOptions

            ImageLoader.getInstance().displayImage(url, this, new ImageLoadingListener() {
    
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    //图片形如加载,可以做一些提示操作
                 }
    
                @Override
                public void onLoadingFailed(String imageUri, View view,FailReason failReason) {
                     //图片加载失败      
                 }
    
                @Override
                 public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                     //图片加载成功,可以再次根据需求对图片进行处理      
                 }
    
                 @Override
                  public void onLoadingCancelled(String imageUri, View view) {
                      //图片加载取消
                   }
              },displayImageOptions);
          }      

              参数

                displayImageOptions:可以通过以下方式设置

           DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                  .cacheInMemory(true)
                  .cacheOnDisk(true)
                  .bitmapConfig(Bitmap.Config.RGB_565)
                  .imageScaleType(ImageScaleType.IN_SAMPLE_INT)      
.build();      

二、防止OOM产生

             产生的oom:

OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available                                  
      java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available      
      Failed to allocate a 32 byte allocation with 0 free bytes and 3GB until OOM                                         
      java.lang.OutOfMemoryError: Failed to allocate a 32 byte allocation with 0 free bytes and 3GB until OOM             
      at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)                                               
      at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:634)                                    
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:610)                                            
      at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:83)                
      at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:265)   
      at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:223) 
      at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)           
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)                                
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)                                
      at java.lang.Thread.run(Thread.java:818)                                                                          
      

           解决方法:

         1、设置DisplayImageOptions 中.cacheInMemory(false)  ,让图片不缓存于内存中;

       2、在DisplayImageOptions的.bitmapConfig中配置使用Bitmap.Config.RGB555

             代替Bitmap.Config.ARGB8888,减少内存占用;

       3、在ImageLoaderConfiguration的.memoryCache()中配置图片缓存为软缓存或弱缓存;

       4、在DisplayImageOption中配置imageScaleType(ImageScaleType.IN_SAMPLE_INT);

       5、在ImageLoaderConfiguration的.threadPoolSize中减少线程池中线程的个数,最好在5个以下。