原文:
http://blog.csdn.net/fuweiping/article/details/7888924
我自己在使用过程中整理了下。 发现其保存到SD卡部分,工作不大正常。
1: SyncImageLoader.java
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import com.efuture.staff.Global;
import com.efuture.staff.mylog.Log;
public class SyncImageLoader {
private static final String TAG = "SyncImageLoader";
private Object lock = new Object();
private boolean mAllowLoad = true;
private boolean firstLoad = true;
private int mStartLoadLimit = 0;
private int mStopLoadLimit = 0;
final Handler handler = new Handler();
private HashMap<String, SoftReference> imageCache = new HashMap<String, SoftReference>();
public interface OnImageLoadListener {
public void onImageLoad(Integer t, Drawable drawable);
public void onError(Integer t);
}
public void setLoadLimit(int startLoadLimit, int stopLoadLimit) {
if (startLoadLimit > stopLoadLimit) {
return;
}
mStartLoadLimit = startLoadLimit;
mStopLoadLimit = stopLoadLimit;
}
public void restore() {
mAllowLoad = true;
firstLoad = true;
}
public void lock() {
mAllowLoad = false;
firstLoad = false;
}
public void unlock() {
mAllowLoad = true;
synchronized (lock) {
lock.notifyAll();
}
}
public void loadImage(Integer t, String imageUrl,
OnImageLoadListener listener) {
final OnImageLoadListener mListener = listener;
final String mImageUrl = imageUrl;
final Integer mt = t;
new Thread(new Runnable() {
@Override
public void run() {
if (!mAllowLoad) {
if (Global.DBG) {
Log.e(TAG, "prepare to load");
}
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (mAllowLoad && firstLoad) {
loadImage(mImageUrl, mt, mListener);
}
if (mAllowLoad && mt <= mStopLoadLimit && mt >= mStartLoadLimit) {
loadImage(mImageUrl, mt, mListener);
}
}
}).start();
}
private void loadImage(final String mImageUrl, final Integer mt,
final OnImageLoadListener mListener) {
if (imageCache.containsKey(mImageUrl)) {
SoftReference softReference = imageCache.get(mImageUrl);
final Drawable d = (Drawable) softReference.get();
if (d != null) {
handler.post(new Runnable() {
@Override
public void run() {
if (mAllowLoad) {
mListener.onImageLoad(mt, d);
}
}
});
return;
}
}
try {
final Drawable d = loadImageFromUrl(mImageUrl);
if (d != null) {
imageCache.put(mImageUrl, new SoftReference(d));
}
handler.post(new Runnable() {
@Override
public void run() {
if (mAllowLoad) {
mListener.onImageLoad(mt, d);
}
}
});
} catch (IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
mListener.onError(mt);
}
});
e.printStackTrace();
}
}
public static Drawable loadImageFromUrl(String url) throws IOException {
URL m = new URL(url);
InputStream i = (InputStream) m.getContent();
Drawable d = Drawable.createFromStream(i, "src");
return d;
}
}
2: 我们自己的Activity 中:
private ListView mListView;
SyncImageLoader syncimageloader = new SyncImageLoader();
mListView.setOnScrollListener(new OnScrollListener(){
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
if(Global.DBG){
Log.e(TAG,"SCROLL_STATE_FLING");
}
syncimageloader.lock();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
if(Global.DBG){
Log.e(TAG,"SCROLL_STATE_IDLE");
}
loadImage();
//loadImage();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
syncimageloader.lock();
break;
default:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
public void loadImage(){
int start = mListView.getFirstVisiblePosition();
int end =mListView.getLastVisiblePosition();
if(end >= mListData.size()){
end = mListData.size() -1;
}
syncimageloader.setLoadLimit(start, end);
syncimageloader.unlock();
}
3:Adapter (这种Adapter 没有使用ViewHolder)
private class MyStoreGoodsAdapter extends BaseAdapter {
public List<GoodsInfo> mData = new ArrayList<GoodsInfo>();
private LayoutInflater inflater;
private ImageLoader mImageLoader;
SyncImageLoader.OnImageLoadListener imageLoadListener = new SyncImageLoader.OnImageLoadListener(){
@Override
public void onImageLoad(Integer t, Drawable drawable) {
if(mListView!=null){
View view = mListView.findViewWithTag(t);
if(view != null){
ImageView iv = (ImageView) view.findViewById(R.id.iv_mystore_goods_list_image);
iv.setBackgroundDrawable(drawable);
}
}
}
@Override
public void onError(Integer t) {
if(mListView!=null){
View view = mListView.findViewWithTag(t);
if (view != null) {
ImageView iv = (ImageView) view
.findViewById(R.id.iv_mystore_goods_list_image);
iv.setBackgroundResource(R.drawable.icon);
}
}
}
};
public MyStoreGoodsAdapter(Context pcontext) {
inflater = LayoutInflater.from(pcontext);
this.mImageLoader = new ImageLoader();
}
public void addData(List<GoodsInfo> datapiece){
mData.addAll(datapiece);
notifyDataSetChanged();
}
@Override
public int getCount() {
if (mData == null) {
return 0;
} else
return mData.size();
}
@Override
public Object getItem(int position) {
if (mData == null) {
return null;
} else if (position < mData.size()) {
return mData.get(position);
} else
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View pconvertView,
ViewGroup parent) {
if(Global.DBG){
Log.e(TAG, "--getView()--"+position);
}
if(pconvertView == null){
pconvertView = inflater.inflate(R.layout.mystore_goods_list_item, null);
}
pconvertView.setTag(position);
ImageView holder_iv_mystore_goods_list_image = (ImageView) pconvertView
.findViewById(R.id.iv_mystore_goods_list_image);
TextView holder_tv_mystore_goods_list_title = (TextView) pconvertView
.findViewById(R.id.tv_mystore_goods_list_title);
TextView holder_tv_mystore_goods_list_tags_num = (TextView) pconvertView
.findViewById(R.id.tv_mystore_goods_list_tags_num);
TextView holder_tv_mystore_goods_list_fans_num = (TextView) pconvertView
.findViewById(R.id.tv_mystore_goods_list_fans_num);
GoodsInfo data = (GoodsInfo) mData.get(position);
String imgUrl = null;
if (data.images.size() > 0)
imgUrl = data.images.get(0);
if (imgUrl != null && !imgUrl.equals("")) {
if(!TextUtils.isEmpty(imgUrl)){
imgUrl = imgUrl.replace(HttpConstants.ORI, HttpConstants.DEF_VALUE_75);
syncimageloader.loadImage(position,imgUrl,imageLoadListener);
}
}
holder_tv_mystore_goods_list_title.setText(data.name);
holder_tv_mystore_goods_list_tags_num.setText(String
.valueOf(data.tags));
holder_tv_mystore_goods_list_fans_num.setText(String
.valueOf(data.fans));
return pconvertView;
}
}