在帮别人写一个小项目时,要加载本地图片当图片较多时加载会非常慢。所以就用到了异步加载图片。
异步加载图片流程图
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);
}
}
实现效果![生气](http://static.blog.csdn.net/xheditor/xheditor_emot/default/mad.gif)
这个是在虚拟机上测试的,但是放到真机上就会蹦。后来才发现是没有进行内存优化出现OOM了。头疼的问题
!努力解决中
、、、、、