在新浪微博的微博列表中的图片,为了加速其显示也未了加快程序的响应,可以参考该图片异步加载类实现。
public
class
AsyncImageLoader {
// SoftReference是软引用,是为了更好的为了系统回收变量
private HashMap < String, SoftReference < Drawable >> imageCache;
public AsyncImageLoader() {
imageCache = new HashMap < String, SoftReference < Drawable >> ();
}
public Drawable loadDrawable( final String imageUrl, final ImageView imageView, final ImageCallback imageCallback){
if (imageCache.containsKey(imageUrl)) {
// 从缓存中获取
SoftReference < Drawable > softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null ) {
return drawable;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
}
};
// 建立新一个新的线程下载图片
new Thread() {
@Override
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference < Drawable > (drawable));
Message message = handler.obtainMessage( 0 , drawable);
handler.sendMessage(message);
}
}.start();
return null ;
}
public static Drawable loadImageFromUrl(String url){
URL m;
InputStream i = null ;
try {
m = new URL(url);
i = (InputStream) m.getContent();
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, " src " );
return d;
}
// 回调接口
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
}
}
// SoftReference是软引用,是为了更好的为了系统回收变量
private HashMap < String, SoftReference < Drawable >> imageCache;
public AsyncImageLoader() {
imageCache = new HashMap < String, SoftReference < Drawable >> ();
}
public Drawable loadDrawable( final String imageUrl, final ImageView imageView, final ImageCallback imageCallback){
if (imageCache.containsKey(imageUrl)) {
// 从缓存中获取
SoftReference < Drawable > softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null ) {
return drawable;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
}
};
// 建立新一个新的线程下载图片
new Thread() {
@Override
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference < Drawable > (drawable));
Message message = handler.obtainMessage( 0 , drawable);
handler.sendMessage(message);
}
}.start();
return null ;
}
public static Drawable loadImageFromUrl(String url){
URL m;
InputStream i = null ;
try {
m = new URL(url);
i = (InputStream) m.getContent();
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, " src " );
return d;
}
// 回调接口
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
}
}
在Adapter中使用的方法为:
public
class
WeiBoAdapater
extends
BaseAdapter{
private AsyncImageLoader asyncImageLoader;
@Override
public int getCount() {
// TODO Auto-generated method stub
return wbList.size();
}
@Override
public Object getItem( int position) {
// TODO Auto-generated method stub
return wbList.get(position);
}
@Override
public long getItemId( int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView( int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null );
WeiBoHolder wh = new WeiBoHolder();
wh.wbicon = (ImageView) convertView.findViewById(R.id.wbicon);
wh.wbtext = (TextView) convertView.findViewById(R.id.wbtext);
wh.wbtime = (TextView) convertView.findViewById(R.id.wbtime);
wh.wbuser = (TextView) convertView.findViewById(R.id.wbuser);
wh.wbimage = (ImageView) convertView.findViewById(R.id.wbimage);
WeiBoInfo wb = wbList.get(position);
if (wb != null )
{
convertView.setTag(wb.getId());
wh.wbuser.setText(wb.getUserName());
wh.wbtime.setText(wb.getTime());
wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(), wh.wbicon, new ImageCallback(){
public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imageUrl){
imageView.setImageDrawable(imageDrawable);
}
});
if (cachedImage == null )
{
wh.wbicon.setImageResource(R.drawable.usericon);
} else {
wh.wbicon.setImageDrawable(cachedImage);
}
}
return convertView;
}
}
private AsyncImageLoader asyncImageLoader;
@Override
public int getCount() {
// TODO Auto-generated method stub
return wbList.size();
}
@Override
public Object getItem( int position) {
// TODO Auto-generated method stub
return wbList.get(position);
}
@Override
public long getItemId( int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView( int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null );
WeiBoHolder wh = new WeiBoHolder();
wh.wbicon = (ImageView) convertView.findViewById(R.id.wbicon);
wh.wbtext = (TextView) convertView.findViewById(R.id.wbtext);
wh.wbtime = (TextView) convertView.findViewById(R.id.wbtime);
wh.wbuser = (TextView) convertView.findViewById(R.id.wbuser);
wh.wbimage = (ImageView) convertView.findViewById(R.id.wbimage);
WeiBoInfo wb = wbList.get(position);
if (wb != null )
{
convertView.setTag(wb.getId());
wh.wbuser.setText(wb.getUserName());
wh.wbtime.setText(wb.getTime());
wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(), wh.wbicon, new ImageCallback(){
public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imageUrl){
imageView.setImageDrawable(imageDrawable);
}
});
if (cachedImage == null )
{
wh.wbicon.setImageResource(R.drawable.usericon);
} else {
wh.wbicon.setImageDrawable(cachedImage);
}
}
return convertView;
}
}