今天测试了一下之前写的一个从本地加载图片并显示的功能,因为以前测试的时候一次性显示的图片比较少,所以就没发现有卡顿以及进入界面比较慢的问题,但是今天想看一下传入很多图片之后的界面效果,所以就加载了很多图片,传入图片之后一开始进入界面,发现出错,出错运用是因为我往Adapter里面传的参数有一项是ArrayList<Bitmap>,因为一次性传入太多的BitMap,所以越界了,导致程序崩溃,然后改成传路径,这个问题得到解决,但是又发现进入界面的时候特别慢,而且往下滑动的时候也是特别的卡顿,我在重写Adapter的时候用到了优化,但是还是特别卡顿,然后想到我每加载一张图片都是去根据路径去读文件,所以导致卡顿现象特别严重,而且进入的时候也是因为每张图片都去读一下文件,所以进入特别慢,有时候甚至出现OOM的问题。这时突然间感觉自己以前写的时候脑子估计是抽风了,竟然犯了这么弱智的问题,每次读文件是很耗时的,所以程序不崩溃才怪。因此感觉使用缓存的技术来修改自己的程序。因为这次又用到了LruCache技术,所以顺便写一下使用过程吧。
其实方法跟网上大部分讲解的代码都类似,只是把从网络下载图片部分改成从本地加载,而且因为这个程序的特殊性,所以加载的图片不能有相同路径的图片,因为所有的键值对设置我都是以图片的路径做的,所以如果路径相同的话有可能会使图片显示不出来。
public class WineListAdapter extends BaseAdapter implements AbsListView.OnScrollListener {
// 从本地加载图片的线程集合
private List<ImageDownloadTask> mDownloadTaskList;
private LruCache<String, Bitmap> mLruCache;
// 引用外部的变量
private WeakReference<GridView> mGridView;
private WeakReference<List<String>> urls;
private WeakReference<List<String>> names;
private WeakReference<Context> mContext;
// 可见项的第一项的index
private int mFirstVisibleIndex;
// 可见项的个数
private int mVisibleItemCount;
// 是不是第一次打开Activity
private boolean isFirstOpen = true;
public WineListAdapter(Context context, GridView mGridView, List<String> urls, List<String> names) {
this.mContext = new WeakReference<Context>(con