标签:
简介
项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。流程图:
权限
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
控制OOM
然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width 和 android:layout_height设定的值,或者android:maxWidth 和/或 android:maxHeight设定的值来裁剪图片。
- 减少线程池中线程的个数,在ImageLoaderConfiguration中的.threadPoolSize中配置,推荐配置1-5
- 在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
- 在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存
- 在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)
代码
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final ImageView image1 = (ImageView) findViewById(R.id.image1);final ImageView image2 = (ImageView) findViewById(R.id.image2);final ImageView image3 = (ImageView) findViewById(R.id.image3);final ImageView image4 = (ImageView) findViewById(R.id.image4);final ImageView image5 = (ImageView) findViewById(R.id.image5);final ImageView image6 = (ImageView) findViewById(R.id.image6);final ImageView image7 = (ImageView) findViewById(R.id.image7);final ImageView image8 = (ImageView) findViewById(R.id.image8);final ImageView image9 = (ImageView) findViewById(R.id.image9);final ImageView image10 = (ImageView) findViewById(R.id.image10);String imageUrl1 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_1.jpg";String imageUrl2 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_2.jpg";String imageUrl3 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_3.jpg";String imageUrl4 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_4.jpg";String imageUrl5 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_5.jpg";//默认******************************************************************************************ImageLoader.getInstance().loadImage(imageUrl1, new ImageLoadingListener() {@Overridepublic void onLoadingStarted(String imageUri, View view) {}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {image1.setImageBitmap(loadedImage);}@Overridepublic void onLoadingCancelled(String imageUri, View view) {}});//指定图片的大小******************************************************************************************ImageSize mImageSize = new ImageSize(300, 300); //可以指定图片的大小ImageLoader.getInstance().loadImage(imageUrl2, mImageSize, new SimpleImageLoadingListener() {//缺省适配器SimpleImageLoadingListener@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {image2.setImageBitmap(loadedImage);}});//配置一些图片显示的选项******************************************************************************************DisplayImageOptions options = new DisplayImageOptions.Builder()//显示图片的配置.cacheInMemory(true).cacheOnDisk(true)//将图片缓存到内存和硬盘中.showImageOnLoading(R.drawable.loading).showImageOnFail(R.drawable.failed)//设置加载中以及图片加载出现错误时显示的图片.bitmapConfig(Bitmap.Config.RGB_565).build();ImageLoader.getInstance().loadImage(imageUrl3, options, new SimpleImageLoadingListener() {@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {super.onLoadingComplete(imageUri, view, loadedImage);image3.setImageBitmap(loadedImage);}});//使用displayImage()加载图片******************************************************************************************ImageLoader.getInstance().displayImage(imageUrl4, image4, options);//会根据控件的大小和imageScaleType来自动裁剪图片//显示图片下载进度******************************************************************************************ImageLoader.getInstance().displayImage(imageUrl5, image5, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {@Overridepublic void onProgressUpdate(String imageUri, View view, int current, int total) {//得到图片的加载进度// Log.i("bqt", imageUri + "----" + current + "----" + total);}});//加载其他来源的图片,可以是http https file assets drawable content************************************************************//sd卡,其中指定的文件可以是视频文件,此工具会自动加载视频的缩略图ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(Environment.getExternalStorageDirectory().getPath() + "/a.png"), image6, options);ImageLoader.getInstance().displayImage("file:///mnt/sdcard/a.mp4", image7, options);//assetsImageLoader.getInstance().displayImage("assets://a.png", image8, options);//或使用【Scheme.ASSETS.wrap("a.png")】//drawableImageLoader.getInstance().displayImage("drawable://" + R.drawable.a, image9, options);//Content provider,可以是视频文件ImageLoader.getInstance().displayImage("content://media/external/audio/albumart/a", image10, options);}}
布局
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#fff"android:orientation="vertical" ><ImageViewandroid:id="@+id/image6"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image7"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image8"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image9"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image10"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image1"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image2"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image3"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image4"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/image5"style="@style/ImageStyle" /></LinearLayout></ScrollView><style name="ImageStyle" ><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:layout_gravity">center</item><item name="android:background">#55660077</item><item name="android:layout_margin">5dp</item></style>
Application
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中ImageLoaderConfiguration.Builder configuration = new ImageLoaderConfiguration.Builder(this);configuration.diskCacheSize(100 * 1024 * 1024); // 100 MiBImageLoader.getInstance().init(configuration.build());// 也可以自己设置配置参数,很多设置在新版中已经被废弃了// initImageLoader(getApplicationContext());}public static void initImageLoader(Context context) {ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);config.threadPriority(Thread.NORM_PRIORITY - 2);config.denyCacheImageMultipleSizesInMemory();config.diskCacheFileNameGenerator(new Md5FileNameGenerator());config.diskCacheSize(50 * 1024 * 1024); // 50 MiBconfig.tasksProcessingOrder(QueueProcessingType.LIFO);config.writeDebugLogs(); // 打印log信息,Remove for release APPImageLoader.getInstance().init(config.build());}}
标签:
原文地址:http://www.cnblogs.com/baiqiantao/p/5454210.html