android中,由于图像处理不当而引起的OOM问题及其解决方案(二)


重要:而通常情景是,这个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);

即可。


本篇完。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值