AsyncImageLoader.java(异步加载图片工具类)
package com.example.imagelist.utils;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
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);
}
}
MainActivity.java
package com.example.imagelist;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.example.imagelist.utils.AsyncImageLoader;
import com.example.imagelist.utils.AsyncImageLoader.ImageCallback;
public class MainActivity extends Activity {
private AsyncImageLoader asyncImageLoader;
private GridView gridView;
private Handler handler;
private ImageAdapter imageAdapter;
private List<String> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = (GridView) this.findViewById(R.id.gridview);
data = new ArrayList<String>();
for(int i = 0; i < 9; i++){
data.add("String"+i);
}
imageAdapter = new ImageAdapter(data, getApplicationContext());
gridView.setAdapter(imageAdapter);
new GetHomeTimeLineThread().start();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
gridView.setAdapter(imageAdapter);
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class ImageAdapter extends BaseAdapter{
private List<String> data;
private Context context;
private LayoutInflater inflate;
public ImageAdapter(List<String> data, Context context) {
super();
this.data = data;
this.context = context;
inflate = getLayoutInflater();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int location) {
// TODO Auto-generated method stub
return data.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
asyncImageLoader = new AsyncImageLoader();
if(convertView == null){
viewHolder = new ViewHolder();
convertView = inflate.inflate(R.layout.item, null);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);
viewHolder.progressBar = (ProgressBar)convertView.findViewById(R.id.progressBar);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
ImageView imageView = viewHolder.imageView;
final ProgressBar progressBar = viewHolder.progressBar;
//异步加载图片
Drawable cachedImage = asyncImageLoader.loadDrawable("http://169.254.214.119:8090/examples/1.JPG",imageView, new ImageCallback(){
@Override
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl) {
imageView.setImageDrawable(imageDrawable);
progressBar.setVisibility(ProgressBar.INVISIBLE);
}
});
/**
* 下面的if语句作用是:
* 当cachedImage==null表示asyncImageLoader没有调用回调方法显示图片内容,
* cachedImage!=null表示从缓存中取得数据,因此if语句作用是将缓存中的图片显示出来
*/
if(cachedImage != null){
imageView.setImageDrawable(cachedImage);
progressBar.setVisibility(ProgressBar.INVISIBLE);
}
return convertView;
}
}
class GetHomeTimeLineThread extends Thread {
@Override
public void run() {
imageAdapter = new ImageAdapter(data, getApplicationContext());
Message msg = handler.obtainMessage();//通知线程来处理范围的数据
handler.sendMessage(msg);
}
}
static class ViewHolder{
ImageView imageView;
ProgressBar progressBar;
}
}
item.xml(GridView容器中的Item)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:contentDescription="@string/app_name"/>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_gravity="center_vertical|center_horizontal"/>
</FrameLayout>