网络相册:Gallery+AsyncTask+URLConnection 实现异步加载网络图片

这个例子需要点基础知识:

  • Gallery的使用,这个网上的例子多的是
  • 如何使用AsyncTask,这个可以看这里《[Android]异步任务AsyncTask使用解析
  • 使用URLConnection从网络下载图片,这个我在代码中加了很详细的注释
异步加载在Android应用上用处很广泛,这篇例子的Adapter部分完全可以移植到其他的组件中,如ListView。下面,我们来看代码吧:
首先,是最核心的代码ImageAdapter的实现,所有核心的功能都是在这里实现的
public class ImageAdapter extends BaseAdapter{
    private List<String> imageUrls;       //图片地址list
    private Context context;

    public ImageAdapter(List<String> imageUrls, Context context) {
        this.imageUrls = imageUrls;
        this.context = context;
    }

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

    public Object getItem(int position) {
        return imageUrls.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {

        Bitmap image;
        if(convertView==null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item,null); //实例化convertView

            image = UrlConnectionActivity.imagesCache.get(imageUrls.get(position)); //从缓存中读取图片
            if(image==null){
                //当缓存中没有要使用的图片时,先显示默认的图片
                image = UrlConnectionActivity.imagesCache.get("background_non_load");
                //异步加载图片
                LoadImageTask task = new LoadImageTask(convertView);
                task.execute(imageUrls.get(position));
            }
            convertView.setTag(image);

        }
       else{
            image = (Bitmap) convertView.getTag();
        }
        ImageView imageView = (ImageView) convertView.findViewById(R.id.gallery_image);
        imageView.setImageBitmap(image);
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);



        return convertView;
    }

    //加载图片的异步任务
    class LoadImageTask extends AsyncTask<String,Void,Bitmap>{
         private View resultView;

        LoadImageTask(View resultView) {
            this.resultView = resultView;
        }
         // doInBackground完成后才会被调用
        @Override
            protected void onPostExecute(Bitmap bitmap) {
                //调用setTag保存图片以便于自动更新图片
                resultView.setTag(bitmap);
            }
            //从网上下载图片
            @Override
            protected Bitmap doInBackground(String... params) {
                Bitmap image=null;
                   try {
                       //new URL对象  把网址传入
                       URL url = new URL(params[0]);
                       //取得链接
                       URLConnection conn = url.openConnection();
                       conn.connect();
                       //取得返回的InputStream
                       InputStream is = conn.getInputStream();
                       //将InputStream变为Bitmap
                       image = BitmapFactory.decodeStream(is);
                       is.close();
                       UrlConnectionActivity.imagesCache.put(params[0],image);   //把下载好的图片保存到缓存中
                   } catch (Exception e) {
                       e.printStackTrace();
                   }

                return image;
            }
    }
}

在ImageAdapter中用到的XML文件:res/layout/item.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
    <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/gallery_image"/>
</LinearLayout>

在Activity中的使用:
public class MyActivity extends Activity{
    public static HashMap<String,Bitmap> imagesCache=new HashMap<String, Bitmap>(); //图片缓存
    private Gallery images_ga;
    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.url_connection_image);
        init();

    }
    private void init(){
        Bitmap image= BitmapFactory.decodeResource(getResources(),R.drawable.jiazaizhong);
        imagesCache.put("background_non_load",image);       //设置缓存中默认的图片

        images_ga = (Gallery) findViewById(R.id.image_wall_gallery);
        List<String> urls = new ArrayList<String>(); //图片地址List
        //奶茶MM的图片,嘻嘻
        urls.add("http://fujian.xabbs.com/forum/201109/02/160646nn9hjjiimixvkxhe.jpg");
        urls.add("http://img1.cache.netease.com/catchpic/A/A9/A9D98040B397C366AE93E67871346561.jpg");
        urls.add("http://new.aliyiyao.com/UpFiles/Image/2011/01/13/nc_129393721364387442.jpg");
        urls.add("http://pic.viewpics.cn/2011/07/03/naichaMMzhangzetianzuixinzhaopian/18.jpg");
        urls.add("http://i1.sinaimg.cn/ent/m/c/2010-01-18/U1819P28T3D2847679F326DT20100118115712.jpg");
        urls.add("http://comic.sinaimg.cn/2011/0824/U5237P1157DT20110824161051.jpg");
        ImageAdapter imageAdapter = new ImageAdapter(urls,this);
        images_ga.setAdapter(imageAdapter);

    }

}


  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值