Gridview显示多张网络图片

本文详细介绍了如何使用异步加载图片并进行缓存处理,包括使用SoftReference来优化内存管理,以及实现一个自定义的异步加载器AsyncImageLoader。通过创建缓存并利用线程异步下载图片,确保了UI的流畅性和资源的有效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值