简介
https://github.com/nostra13/Android-Universal-Image-Loader 项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。 如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。 如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。 流程图:
权限 <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,我们应该怎么去改善呢?
- 减少线程池中线程的个数,在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 { @Override protected 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() { @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) { image1.setImageBitmap(loadedImage); } @Override public void onLoadingCancelled(String imageUri, View view) { } }); //指定图片的大小****************************************************************************************** ImageSize mImageSize = new ImageSize(300, 300); //可以指定图片的大小 ImageLoader.getInstance().loadImage(imageUrl2, mImageSize, new SimpleImageLoadingListener() {//缺省适配器SimpleImageLoadingListener @Override public 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() { @Override public 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() { @Override public 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); //assets ImageLoader.getInstance().displayImage("assets://a.png", image8, options);//或使用【Scheme.ASSETS.wrap("a.png")】 //drawable ImageLoader.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" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#fff" android:orientation="vertical" > <ImageView android:id="@+id/image6" style="@style/ImageStyle" /> <ImageView android:id="@+id/image7" style="@style/ImageStyle" /> <ImageView android:id="@+id/image8" style="@style/ImageStyle" /> <ImageView android:id="@+id/image9" style="@style/ImageStyle" /> <ImageView android:id="@+id/image10" style="@style/ImageStyle" /> <ImageView android:id="@+id/image1" style="@style/ImageStyle" /> <ImageView android:id="@+id/image2" style="@style/ImageStyle" /> <ImageView android:id="@+id/image3" style="@style/ImageStyle" /> <ImageView android:id="@+id/image4" style="@style/ImageStyle" /> <ImageView android: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 { @Override public void onCreate() { super.onCreate(); //在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中 ImageLoaderConfiguration.Builder configuration = new ImageLoaderConfiguration.Builder(this); configuration.diskCacheSize(100 * 1024 * 1024); // 100 MiB ImageLoader.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 MiB config.tasksProcessingOrder(QueueProcessingType.LIFO); config.writeDebugLogs(); // 打印log信息,Remove for release APP ImageLoader.getInstance().init(config.build()); } }
时间: 2024-10-13 04:33:53