Android异步加载图片,解决图片过大OOM问题

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.widget.ImageView;

/**
 * 
 * 功能说明:异步加载图片
 * 
 * @author Jack.wang
 * 
 */
public class AsyncImageLoaderCore
{

	public Context context; // 做本地缓存时会用到
    public HashMap<String, SoftReference<Bitmap>> imageCache;// 软引用集合

    public AsyncImageLoaderCore(Context context)
    {
        this.context = context;
        this.imageCache = new HashMap<String, SoftReference<Bitmap>>();
    }

    public Bitmap loadBitmap(final String imageUrl, final ImageView imageView, final ImageCallback imageCallback)
    {
        if (imageCache.containsKey(imageUrl))
        {
            SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
            if (softReference.get() != null)
                return softReference.get();
        }

        final Handler handler = new Handler(new Callback()
        {

            @Override
            public boolean handleMessage(Message msg)
            {
                imageCallback.imageLoaded((Bitmap) msg.obj, imageView, imageUrl);
                return false;
            }
        });

        new Thread()
        {
            @Override
            public void run()
            {
                Bitmap bitmap = null;
                try
                {
                    bitmap = getHttpBitmap(imageUrl);
                } 
                catch (Exception e)
                {
                    e.printStackTrace();
                	return;
                }
                
                if (null != bitmap)
                {
                    imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
                    handler.sendMessage(handler.obtainMessage(0, bitmap));
                }
            }
        }.start();

        return null;
    }
    
    private final int MAX_PIC_LENGTH = 200000;// 最大字节长度限制[可调,最好不要超过200000]
    private final int SAMPLE_SIZE = 14;// 裁剪图片比列(1/14)[可调]
    
    /**
     * 获取网络图片
     */
    private Bitmap getHttpBitmap(String imgUrl) throws Exception
    {
        URL htmlUrl = new URL(imgUrl);
        URLConnection connection = htmlUrl.openConnection();
        HttpURLConnection conn = (HttpURLConnection) connection;
        
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK)
        {
        	InputStream inputStream = conn.getInputStream();
        	
        	byte[] bytes = changeToBytes(inputStream);
        	
        	if(bytes.length < MAX_PIC_LENGTH)
    		{
        		return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    		}
        	else if(bytes.length < MAX_PIC_LENGTH * SAMPLE_SIZE)
        	{
        		BitmapFactory.Options options = new BitmapFactory.Options();
        		options.inJustDecodeBounds = false;
        		options.inSampleSize = SAMPLE_SIZE;
        		
        		return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
        	}
        }
        
        return null;
    }

    /**
     * 将流转换成字节数组
     */
	public byte[] changeToBytes(InputStream inputStream) throws Exception
	{
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];// 每次读取的字节长度
		int len = 0;
		while((len = inputStream.read(buffer)) != -1)
		{
			outputStream.write(buffer, 0, len);
		}
		inputStream.close();
		return outputStream.toByteArray();
	}

	/**
	 * 异步加载资源回调接口
	 */
	public interface ImageCallback
    {
        public void imageLoaded(Bitmap bitmap, ImageView imageView, String imageUrl);
    }

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。