重要:而通常情景是,这个OOM不是必现的,有时运行过程中会发生,有时,同样的代码,有的手机上不出现;有的手机上会偶现。
这就加大了解决问题的难度。不过,只要遵循一定的良好的编程方式,还是有办法避免的。上一篇章,介绍了常见的图片加载引起的OOM问题,即使将图片大小缩小到了20K,也还是有可能发生OOM。
解决方法:不要直接调用ImageView的setImageBitmap,setImageResource,setBackground等方法去设置view。这里,建议大家用第三方开源框架ImageLoader。
至于ImageLoader的强大,及其详细使用方法,本文略过。
1. 对于上一篇中的场景1,可以这样做:
将xml中的android:background去掉,在java代码中,通过ImageLoader加载。如,可以改为:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_white" android:id="@+id/main_activity_layout"> <ImageView android:id="@+id/image_app_background" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY"/> </RelativeLayout>
在java代码中,用如下方式加载一个本地资源文件:
ImageLoader.getInstance().displayImage("drawable://" + R.mipmap.csr_qd_pad,imageBackground);
这样,就可以了。
2. 对于场景2:
用ImageLoader.getInstance().displayImage(url,imageview,option)来加载。
参数url,即网络图片地址。
例如:
options = new DisplayImageOptions.Builder() .showImageOnLoading(R.mipmap.ic_stub) .showImageForEmptyUri(R.mipmap.ic_empty) .showImageOnFail(R.mipmap.ic_error).cacheInMemory(true) .cacheOnDisk(true).considerExifParams(true).build(); try { ImageLoader.getInstance().displayImage(model.iconUrl,mImageView, options); } catch (Exception e) { e.printStackTrace(); }
3. ImageLoader的初始化:
为了使用ImageLoader,需要对其进行初始化,建议在Application中进行,例如:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( context).threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator()) .diskCacheSize(50 * 1024 * 1024) .tasksProcessingOrder(QueueProcessingType.LIFO) .imageDownloader(new AuthImageDownloader(mContext)) .build(); // Initialize ImageLoader with configuration. ImageLoader.getInstance().init(config);
即可。
本篇完。