andriod 异步加载网络图片(LruCache缓存网络图片)

LruCache以键值对的形式,初始化时,需要设置缓存的大小K,超过这个大小的数据将会被清除。注意:清除的数据,是那些被先加入的数据。LruCache内部的数据结构是LinkedHashMap存储的。这样,LruCache就达到了缓存最近put的K个数据。


int cacheSize = 4 * 1024 * 1024; // 4MiB
   LruCache bitmapCache = new LruCache(cacheSize) {
       protected int sizeOf(String key, Bitmap value) {
           return value.getByteCount();
       
   }}

注意,缓存不同的数据,需要重写sizeOf方法。比如,上面缓存的是图片。本质上,这些数据都是存储在内存中的,因此,cacheSize不易过大。


ImageLoder.java

package com.example.asynctask2;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.LruCache;

import android.widget.ImageView;

@SuppressLint("NewApi")
public class ImageLoder {
	private ImageView mImageView;
	
	//图片缓存
	private LruCache<String,Bitmap> mcache;
    private String mUrl;
 
    public  ImageLoder(){
    	//获取最大可用内存
    	int maxMemory=(int) Runtime.getRuntime().maxMemory();
    	int cacheSize=maxMemory/4;
    	//Log.i("maxMemory",""+cacheSize);
    	mcache = new LruCache<String, Bitmap>(cacheSize){  
    		  
             //必须重写此方法,来测量Bitmap的大小  
             @Override  
             protected int sizeOf(String key, Bitmap value) {  
                 return value.getRowBytes();  
             }  
             
    	};
    }
    
    /** 
     * 添加Bitmap到内存缓存 
     * @param key 
     * @param bitmap 
     */  
    public void addBitmapToMemoryCache(String key, Bitmap bitmap) {    
        if (getBitmapFromMemCache(key) == null && bitmap != null) {    
        	mcache.put(key, bitmap);    
        }    
    }    
       
    /** 
     * 从内存缓存中获取一个Bitmap 
     * @param key 
     * @return 
     */  
    public Bitmap getBitmapFromMemCache(String key) {    
        return mcache.get(key);    
    }   
	 
	/**
	 * 使用异步任务获取网络图片
	 * @param imageview
	 * @param url
	 */
	public void showImageByAsyncTask(ImageView imageview,final String url){
		
		Bitmap bitmap = getBitmapFromMemCache(url);
		 
		if(bitmap==null){
			new ImgNetByAsyncTask(imageview,url).execute(url);
		}else{
			imageview.setImageBitmap(bitmap); 
		}
 	
	}
 	
	private class ImgNetByAsyncTask extends AsyncTask<String, Void, Bitmap>{
        
		private ImageView tImageView;
		private String mUrl;
		
		public ImgNetByAsyncTask(ImageView imageview,String url){
			tImageView=imageview;
			mUrl=url;
		}
 
		protected Bitmap doInBackground(String... params) {
			String url=params[0];
			Bitmap bitmap = getBitmapFromURL(url);
            if(bitmap!=null){
            	addBitmapToMemoryCache(url,bitmap);
            } 
            return bitmap;  
		}

        protected void onPostExecute(Bitmap bitmap) {  
              super.onPostExecute(bitmap);   
              if(tImageView.getTag().equals(mUrl)){
            	  tImageView.setImageBitmap(bitmap);  
  			  }
        } 

	}
 
	public Bitmap getBitmapFromURL(String urlString){
		Bitmap bitmap;
		InputStream is=null;
		try {
			URL url=new URL(urlString);
			HttpURLConnection connection=(HttpURLConnection) url.openConnection();
			is=new BufferedInputStream(connection.getInputStream());
			bitmap=BitmapFactory.decodeStream(is);
			connection.disconnect();
			return bitmap;
			
		} catch (java.io.IOException e) {
			e.printStackTrace();
		}finally{
			
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}

NewAdapter.java

package com.example.asynctask2;

import java.util.List;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.Volley;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NewAdapter  extends BaseAdapter{
	private RequestQueue mRequestQueue;  
	private List<NewBean> mlist;
	private LayoutInflater mInflater;
	private ImageLoder loder;
	private ImageLoader imageLoader;
	
	public NewAdapter(Context context,List<NewBean> data){
		
		loder=new ImageLoder();
		mlist=data;
		mInflater=LayoutInflater.from(context);
	}
	@Override
	public int getCount() {
		return mlist.size();
	}

	@Override
	public Object getItem(int position) {
		return mlist.get(position);
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
	
		ViewHolder viewHolder=null;
		if(convertView==null){
			viewHolder=new ViewHolder();
			convertView=mInflater.inflate(R.layout.item_layout, null);
			viewHolder.ivIcon=(ImageView) convertView.findViewById(R.id.tv_icon);
			viewHolder.tvTitle=(TextView) convertView.findViewById(R.id.tv_title);
			viewHolder.tvContent=(TextView) convertView.findViewById(R.id.tv_content);
			convertView.setTag(viewHolder);
		}else{
			viewHolder=(ViewHolder) convertView.getTag();
		}
		
		viewHolder.ivIcon.setImageResource(R.drawable.ic_launcher);
		String url= mlist.get(position).IconUrl;
		viewHolder.ivIcon.setTag(url);
		
	
		/**
		 * 使用AsyncTask 异步加载图片
		 */
		loder.showImageByAsyncTask(viewHolder.ivIcon,url);
		
		viewHolder.tvTitle.setText(mlist.get(position).newtitle);
		viewHolder.tvContent.setText(mlist.get(position).newcontent);
		
		return convertView;
	}
	
	
 
	
	class ViewHolder{
		public TextView tvTitle,tvContent;
		public ImageView ivIcon;
	}
	


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值