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;
}
}