Android高效加載大圖、多圖解決方案,有效避免程序內存溢出現象

好久沒有寫博客了,今天就先寫一個小的關於在Android中加載大圖如何避免內存溢出的問題。

後面會寫如何使用緩存技術的核心類,android.support.v4.util.LruCache來加載圖片。


直接上代碼:

package com.example.oom_demo1;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.widget.ImageView;

/**
 *  Android高效加載大圖、多圖解決方案,有效避免程序OOM
 *  方法1
 * **/
public class MainActivity extends Activity {

	private ImageView mImageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mImageView = (ImageView) findViewById(R.id.imageView);
//		下面的代碼非常簡單地將任意一張圖片壓縮成100*100的縮略圖,並在ImageView上展示。
		mImageView.setImageBitmap(decodeSampledBitmapFromResource(
				getResources(), R.drawable.a, 100, 100));
	}

	public static Bitmap decodeSampledBitmapFromResource(Resources res,
			int resId, int reqWidth, int reqHeight) {
		// 第一次解析將inJustDecodeBounds設置爲true,來獲取圖片大小
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(res, resId, options);
		// 調用上面定義的方法計算inSampleSize值
		options.inSampleSize = calculateInSampleSize(options, reqWidth,
				reqHeight);
		// 使用獲取到的inSampleSize值再次解析圖片
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeResource(res, resId, options);
	}

	public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		// 源圖片的高度和寬度
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			// 計算出實際寬高和目標寬高的比率
			final int heightRatio = Math.round((float) height
					/ (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			// 選擇寬和高中最小的比率作爲inSampleSize的值,這樣可以保證最終圖片的寬和高
			// 一定都會大於等於目標的寬和高。
			inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return inSampleSize;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


注:

你需要在你的工程目錄下加入一張直接的較大的圖片,然後進行

mImageView.setImageBitmap(decodeSampledBitmapFromResource(
getResources(), R.drawable.a, 100, 100));改成你自己的圖片文件即可。

發佈了68 篇原創文章 · 獲贊 44 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章