当前位置: 代码迷 >> 综合 >> andriod 异步加载网络图片(LruCache缓存网络图片)
  详细解决方案

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

热度:0   发布时间:2023-12-18 22:41:03.0

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


int cacheSize = 4 * 1024 * 1024; // 4MiBLruCache 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);}@Overridepublic int getCount() {return mlist.size();}@Overridepublic Object getItem(int position) {return mlist.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}