本地图片的异步加载

     在帮别人写一个小项目时,要加载本地图片当图片较多时加载会非常慢。所以就用到了异步加载图片。

   异步加载图片流程图

     

     1、适配器Adapter类GridViewAdapter.java

import java.util.List;

import com.phont.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class GridViewAdapter extends BaseAdapter {

	private List<String> allPhotoList;// 所有照片
	private List<String> allPhotoName;// 所有照片的名称
	private LayoutInflater mInflater;
	private AsyncLoadImage asyncLoadImage;

	public GridViewAdapter(Context context, List<String> allPhotoList,
			List<String> allPhotoName) {
		this.allPhotoList = allPhotoList;
		this.allPhotoName = allPhotoName;
		mInflater = LayoutInflater.from(context);
		asyncLoadImage = new AsyncLoadImage();
	}

	@Override
	public int getCount() {
		return allPhotoList == null ? 0 : allPhotoList.size();
	}

	@Override
	public Object getItem(int position) {
		return allPhotoList.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View arg1, ViewGroup arg2) {
		RelativeLayout rl = (RelativeLayout) mInflater.inflate(
				R.layout.grid_item, null);

		final ImageView iv = (ImageView) rl.findViewById(R.id.image_item);
		// 异步加载图片并显示
		asyncLoadImage.loadDrawable(allPhotoList.get(position),
				new CallbackImpl(iv));

		TextView tv = (TextView) rl.findViewById(R.id.text_item);
		tv.setText(allPhotoName.get(position));
		return rl;
	}

}
       2、异步加载类AsyncLoadImage.java
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;

public class AsyncLoadImage {
	// 图片缓存
	// string是图片的imagePath,值是一个SoftReference对象,该对象指向一个Bitmap的对象
	private Map<String, SoftReference<Bitmap>> imageCache = 
			new HashMap<String, SoftReference<Bitmap>>();

	@SuppressLint("HandlerLeak")
	public void loadDrawable(final String imagePath, 
			final ImageCallback callback) {

		if (imageCache.containsKey(imagePath)) {
			//根据路径得到Softreference对象
			SoftReference<Bitmap> softReference = imageCache.get(imagePath);
			if (softReference.get() != null) {
				//若有该缓存,则回调显示该图片
				callback.imageLoaded(softReference.get());
			}
		}
		final Handler handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				//回调显示图片
				callback.imageLoaded((Bitmap) msg.obj);
			}
		};
		//开启子线程加载图片
		new Thread() {
			public void run() {
				Bitmap bm = Bitmap.createScaledBitmap(
						BitmapFactory.decodeFile(imagePath), 120, 160, true);
				Message msg = handler.obtainMessage(0, bm);
				handler.sendMessage(msg);
			};
		}.start();
	}
	//回调接口
	public interface ImageCallback {
		public void imageLoaded(Bitmap bitmap);
	}
}
       3、回调接口类的实现CallbackImpl.java
import com.phont.lookallphoto.AsyncLoadImage.ImageCallback;

import android.graphics.Bitmap;
import android.widget.ImageView;

public class CallbackImpl implements ImageCallback {
	private ImageView imageView;

	public CallbackImpl(ImageView imageView) {
		super();
		this.imageView = imageView;
	}

	@Override
	public void imageLoaded(Bitmap bitmap) {
		imageView.setImageBitmap(bitmap);
	}

}
       实现效果生气
        

        这个是在虚拟机上测试的,但是放到真机上就会蹦惊讶。后来才发现是没有进行内存优化出现OOM了。头疼的问题抓狂!努力解决中奋斗、、、、、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值