Android中加载大图片放置OOM异常

加载大图片防止OOM异常

在加载图片时,不管是网络上下载的还是自定义的一个图片动辄就是好几M,这时候手机运行一方面会造成卡顿,另一方面手机性能较差的话会造成软件运行OOM异常,为了更好的用户体验,需要将图片进行原比例缩放,不失真的同时显示想要设定的图片样式,好了,不妨多说,,如下是代码

package com.oblivion.loadbigimage;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

//声明全局变量,配置文件中ImageView
    private ImageView iv_loadbigimage;
 //声明全局变量,配置文件中ImageView
    private Button bt_loadbigimage;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_loadbigimage = (ImageView) findViewById(R.id.iv_loagbigimage);
        bt_loadbigimage = (Button) findViewById(R.id.bt_loadbigimage);
        bt_loadbigimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "点击加载");
                new Thread() {
                    @Override
                    public void run() {
                        //获取 选择项Options
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        //仅获取所选择图片的边框
                        options.inJustDecodeBounds = true;
                        //作为参数传入到要加载的图片中
                        BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG_0248.JPG", options);
                        //设置适配值
                        options.inSampleSize = getSize(options);
                        //将仅选择边框设定为false
                        options.inJustDecodeBounds = false;
                        //定义显示的图片
                        final Bitmap newBiemap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG_0248.JPG", options);
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                //子线程更新UI
                                iv_loadbigimage.setImageBitmap(newBiemap);

                            }
                        });
                    }
                }.start();

            }
        });

    }

    /**
     * 获取放置OOM溢出的边框适配值
     *
     * @param options 选择项
     * @return 需要设定的缩放值
     */
    public int getSize(BitmapFactory.Options options) {
    //通过WindowManager 获取界面的宽高
        WindowManager mwm = (WindowManager) getSystemService(WINDOW_SERVICE);
        int wmHeight = mwm.getDefaultDisplay().getHeight();
        int wmWidth = mwm.getDefaultDisplay().getWidth();
        //要加载的图片的宽高
        int relHeight = options.outHeight;
        int relWidth = options.outWidth;
        //比较两者的宽高比,返回较大值
        return (relHeight / wmHeight) > (relWidth / wmWidth) ? (relHeight / wmHeight) : (relWidth / wmWidth);
    }

}

UI界面
<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.oblivion.loadbigimage.MainActivity">

    <Button
        android:id="@+id/bt_loadbigimage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/loadBigImage" />
    <ImageView
        android:layout_below="@+id/bt_loadbigimage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/iv_loagbigimage"/>
</RelativeLayout>

原创github源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值