本地图片的异步加载

来源:互联网 发布:SQL默认值为0 编辑:程序博客网 时间:2024/05/21 05:21

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

   异步加载图片流程图

     

     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();}@Overridepublic int getCount() {return allPhotoList == null ? 0 : allPhotoList.size();}@Overridepublic Object getItem(int position) {return allPhotoList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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() {@Overridepublic 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;}@Overridepublic void imageLoaded(Bitmap bitmap) {imageView.setImageBitmap(bitmap);}}
      实现效果生气
        

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

0 0