异步加载图片

来源:互联网 发布:杨氏双缝干涉实验数据 编辑:程序博客网 时间:2024/05/16 16:04


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import android.widget.TextView;

import com.vzo.vpn.model.TestSmsBean;
import com.vzo.vpn.utility.AsyncImageLoaderEx;

public class HomeSMSAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private List<TestSmsBean> list;
    private Context context;
    private Date d;
    private SimpleDateFormat sdf;
    private ViewHolder holder;
    private View parentView;

    public HomeSMSAdapter(Context context, View parent) {
        mInflater = LayoutInflater.from(context);
        this.list = new ArrayList<TestSmsBean>();
        this.context = context;
        this.d = new Date();
        this.sdf = new SimpleDateFormat("MM/dd HH:mm");
        this.parentView = parent;
    }

    public void assignment(List<TestSmsBean> list) {
        this.list = list;
    }

    public void add(TestSmsBean bean) {
        list.add(bean);
    }

    public void remove(int position) {
        list.remove(position);
    }

    public int getCount() {
        return list.size();
    }

    public TestSmsBean getItem(int position) {
        return list.get(position);
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        holder = null;
        if (convertView == null) {
            Log.i("where", "null position=" + position);
            convertView = mInflater.inflate(R.layout.home_sms_list_item,
                    parent, false);
            holder = new ViewHolder();
            holder.icon = (ImageView) convertView.findViewById(R.id.qcb);
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.count = (TextView) convertView.findViewById(R.id.count);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.content = (TextView) convertView.findViewById(R.id.content);
            convertView.setTag(holder);
        } else {
            Log.i("where", "!null position=" + position);
            holder = (ViewHolder) convertView.getTag();
        }
        // 头像
        TestSmsBean smsb = null;
        smsb = list.get(position);

        String imgUrl = smsb.getImg();
        Log.i("url", "url = " + imgUrl);
        holder.icon.setTag(imgUrl);
        if (null == imgUrl) {
            Log.i("where", "null == imgUrl pos=" + pos);
            holder.icon.setImageResource(R.drawable.ic_launcher);
        } else {
            
            AsyncImageLoaderEx asyncImageLoader = new AsyncImageLoaderEx(
                    context);
            Drawable imageDrawable = asyncImageLoader.loadDrawable(imgUrl,
                    new AsyncImageLoaderEx.ImageCallback() {
                        public void imageLoaded(Drawable imageDrawable,
                                String imageUrl) {
                            ImageView iconView = (ImageView) parentView
                                    .findViewWithTag(imageUrl);
                            if (iconView != null && imageDrawable != null) {
                                Log.i("where", "iconView != null pos=" + pos
                                        + "imageUrl = " + imageUrl);
                                iconView.setImageDrawable(imageDrawable);

                            }
                        }
                    });
            if (imageDrawable != null) {
                holder.icon.setImageDrawable(imageDrawable);
                Log.i("where", "imageDrawable != null pos=" + pos);
            } else {
                holder.icon.setImageResource(R.drawable.ic_launcher);
                Log.i("where", "else pos=" + pos);
            }
        }

        holder.name.setText(list.get(position).getTitle());
        holder.date.setText(list.get(position).getTime());
        holder.content.setText(list.get(position).getContent());

        convertView.setTag(holder);
        return convertView;
    }

    public final class ViewHolder {
        public ImageView icon;
        public TextView name;
        public TextView count;
        public TextView date;
        public TextView content;
    }
}


异步加载类

package com.vzo.vpn.utility;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.WindowManager;

public class AsyncImageLoaderEx {
    private Context context;
    // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)
    public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();

    private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务
    private final Handler handler = new Handler();

    public AsyncImageLoaderEx(Context context) {
        this.context = context;
    }
    /**
     *
     * @param imageUrl
     *            图像url地址
     * @param callback
     *            回调接口
     * @return 返回内存中缓存的图像,第一次加载返回null
     */
    public Drawable loadDrawable(final String imageUrl,
            final ImageCallback callback) {
        // 如果缓存过就从缓存中取出数据
        if (imageCache.containsKey(imageUrl)) {
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            if (softReference.get() != null) {
                return softReference.get();
            }
        }
        // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
        executorService.submit(new Runnable() {
            public void run() {
                try {
                    final Drawable drawable = loadImageFromUrl(imageUrl);
//                    final Drawable drawable = extractDrawable(context, imageUrl);

                    imageCache.put(imageUrl, new SoftReference<Drawable>(
                            drawable));

                    handler.post(new Runnable() {
                        public void run() {
                            callback.imageLoaded(drawable, imageUrl);
                        }
                    });
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        });
        return null;
    }

    // 从网络上取数据方法
    protected Drawable loadImageFromUrl(String imageUrl) {
        try {
            // 测试时,模拟网络延时,实际时这行代码不能有
            // SystemClock.sleep(2000);
            return Drawable.createFromStream(new URL(imageUrl).openStream(),
                    "image.png");

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public Drawable extractDrawable(Context context, String imageUrl)
            throws Exception {
        TypedValue value = new TypedValue();
        /** 传入TypeValue,指定资源的像素密度是基于320*480屏幕的 */
//        value.density = context.getResources().getDisplayMetrics().densityDpi;

        final WindowManager windowManager = (WindowManager) context.getSystemService(android.content.Context.WINDOW_SERVICE);
        final Display display = windowManager.getDefaultDisplay();
        final DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        value.density = (int)metrics.ydpi;
        /** 传入Resources,以获取目标屏幕像素密度 */
        Drawable drawable = Drawable.createFromResourceStream(
                context.getResources(), value, new URL(imageUrl).openStream(), "image.png");
        return drawable;
    }

    // 对外界开放的回调接口
    public interface ImageCallback {
        // 注意 此方法是用来设置目标对象的图像资源
        public void imageLoaded(Drawable imageDrawable, String imageUrl);
    }
}


原创粉丝点击