异步加载图片
来源:互联网 发布:杨氏双缝干涉实验数据 编辑:程序博客网 时间: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);
}
}
- 异步加载图片
- 异步加载图片
- ajax异步加载图片
- android异步加载图片
- 异步图片加载实例
- android 异步加载图片
- 图片异步加载
- list 异步加载图片
- 异步加载本地 图片
- UITableView 异步加载图片
- android异步加载图片
- inputstream 异步加载图片
- iPhone 异步加载图片
- android异步加载图片
- 图片的异步加载
- 异步图片加载控件
- uiimageview 异步加载图片
- UITableView异步加载图片
- POJ-1666-Candy Sharing Game
- MAVEN常用命令
- linux内核中typeof的使用说明
- WCF把书读薄(3)——数据契约、消息契约与错误契约
- 在各个平台上关于数据类型的定义
- 异步加载图片
- Spring 3.0 注解注入详解
- POJ-1951-Extra Krunch
- FusionChart 2D面积图
- Java获取网页内容、图片、JavaScript和CSS文件工具类
- POJ-2271-HTML
- GIT版本升级
- Immutable Collections(3)Immutable List实现原理(中)变化中的不变
- linux中shell变量$#,$@,$0,$1,$2的含义解释