安卓二级缓存加载图片实现照片墙功能

  

实现二级缓存加载图片的功能,在使用DiskLruCache时,需先在工程中添加名为libcore.io的包,并将DiskLruCache.Java文件放进去.DiskLruCache直接百度下载即可。

  

在显示数据表格的适配器中,为ImageView添加图片时,先从内存缓存中加载,内存中无缓存的话则在磁盘缓存中加载,磁盘缓存也没有的话开启线程下载,然后将下载的图片缓存到磁盘,内存中。下载的图片最好先进行压缩,文章最后给出了压缩代码,但本例中并未实现压缩。

  

/*二级缓存实现图片墙功能,先在内存中加载缓存,内存中无缓存的话到磁盘缓存中加载,仍然没有的话开启线程下载图片,下载后缓存到磁盘中,然后缓存到内存中*/

  

        公开课ErJiHuanCun延伸ArrayAdapter{/* *   *记录所有正在下载或等待下载的任务。   */私人SettaskCollection;/* *   *图片缓存技术的核心类,用于缓存所有下载好的图片,在程序内存达到设定值时会将最少最近使用的图片移除掉。   */私人LruCache<字符串,Bitmap>mMemoryCache;/* *   *图片硬盘缓存核心类。   */私人DiskLruCache mDiskLruCache;/* *   *显示数据表格的实例   */私人GridView mPhotoWall;/* *   *记录每个子项的高度。   */私人int mItemHeight=0;      公共ErJiHuanCun(上下文语境、int textViewResourceId String[]对象,   显示数据表格photoWall) {   超级(上下文、textViewResourceId对象);   mPhotoWall=photoWall;   taskCollection=new HashSet ();//获取应用程序最大可用内存   .maxMemory int maxMemory=(int) Runtime.getRuntime () ();   int cacheSize=maxMemory/8;//设置图片缓存大小为程序最大可用内存的1/8   mMemoryCache=new LruCache<字符串,Bitmap> (cacheSize) {   @Override   保护int sizeOf(字符串键,位图的位图){   返回bitmap.getByteCount ();   }   };   尝试{//获取图片缓存路径   文件cacheDir=getDiskCacheDir(上下文,“拇指”);   如果(! cacheDir.exists ()) {   cacheDir.mkdirs ();   }//创建DiskLruCache实例,初始化缓存数据   mDiskLruCache=DiskLruCache   .open (cacheDir getAppVersion(上下文),1,10 * 1024 * 1024);   }捕捉(IOException e) {   e.printStackTrace ();   }   }      @Override   公众视线getView (int位置、视图convertView ViewGroup父){   最终字符串url=getItem(位置);   视图视图;   如果(convertView==null) {   视图=LayoutInflater.from (getContext ()) .inflate (R.layout.photo_layout, null);   其他}{   视图=convertView;   }   最后ImageView ImageView=(ImageView) view.findViewById (R.id.photo);   如果(imageView.getLayoutParams ()。高度!=mItemHeight) {   imageView.getLayoutParams ()。身高=mItemHeight;   }//给ImageView设置一个标签,保证异步加载图片时不会乱序   imageView.setTag (url);   imageView.setImageResource (R.drawable.ic_launcher);   loadBitmaps (imageView、url);   返回视图;   }/* *   *将一张图片存储到LruCache中。   *   * @param关键   * LruCache的键,这里传入图片的URL地址。   * @param位图   * LruCache的键,这里传入从网络上下载的位图对象。   */公共空间addBitmapToMemoryCache(字符串键,位图的位图){   如果(getBitmapFromMemoryCache(关键)==null) {   mMemoryCache。把(关键,位图);   }   }/* *   *从LruCache中获取一张图片,如果不存在就返回零。   *   * @param关键   * LruCache的键,这里传入图片的URL地址。   * @return对应传入键的位图对象,或者null。   */公共位图getBitmapFromMemoryCache (String键){   返回mMemoryCache.get(关键);   }/* *   *加载图对象。此方法会在LruCache中检查所有屏幕中可见的ImageView的位图对象,   *如果发现任何一个ImageView的位图对象不在缓存中,就会开启异步线程去下载图片。   */公共空loadBitmaps (ImageView ImageView字符串imageUrl) {   尝试{   位图的位图=getBitmapFromMemoryCache (imageUrl);   如果(位图==null) {   BitmapWorkerTask任务=new BitmapWorkerTask ();   taskCollection.add(任务);   task.execute (imageUrl);   其他}{   如果(imageView !=零,,位图!=null) {   imageView.setImageBitmap(位图);   }   }   }捕捉(异常e) {   e.printStackTrace ();   }   }/* *   *取消所有正在下载或等待下载的任务。   */公共空间cancelAllTasks () {   如果(taskCollection !=null) {   (BitmapWorkerTask任务:taskCollection) {   task.cancel(假);   }   }   }/* *   *根据传入的uniqueName获取硬盘缓存的路径地址。   */公共文件getDiskCacheDir(上下文背景下,字符串uniqueName) {   字符串cachePath;   如果(Environment.MEDIA_MOUNTED.equals (Environment.getExternalStorageState ())   | | ! Environment.isExternalStorageRemovable ()) {   .getPath cachePath=context.getExternalCacheDir () ();   其他}{   .getPath cachePath=context.getCacheDir () ();   }   返回新文件(cachePath +文件。分离器+ uniqueName);   }/* *   *获取当前应用程序的版本号。   */公共int getAppVersion(上下文语境){   尝试{   PackageInfo信息=context.getPackageManager () .getPackageInfo (context.getPackageName (),   0);   返回info.versionCode;   }捕捉(NameNotFoundException e) {   e.printStackTrace ();   }   返回1;   }/* *   子*设置项目项的高度。   */公共空间setItemHeight (int高度){   如果(身高==mItemHeight) {   返回;   }   mItemHeight=身高;   notifyDataSetChanged ();   }/* *   *使用MD5算法对传入的关键进行加密并返回。   */hashKeyForDisk公共字符串(字符串键){   字符串cacheKey;   尝试{   最后MessageDigest mDigest=MessageDigest.getInstance (MD5);   mDigest.update (key.getBytes ());   cacheKey=bytesToHexString (mDigest.digest ());   }捕捉(NoSuchAlgorithmException e) {   cacheKey=String.valueOf (key.hashCode ());   }   返回cacheKey;   }/* *   *将缓存记录同步到杂志文件中。   */公共空间flushCache () {   如果(mDiskLruCache !=null) {   尝试{   mDiskLruCache.flush ();   }捕捉(IOException e) {   e.printStackTrace ();   }   }   }      私人字符串bytesToHexString (byte[]字节){   StringBuilder某人=new StringBuilder ();   for (int i=0;我& lt;bytes.length;我+ +){   十六进制字符串=整数。toHexString (0 xff,字节(我));   如果(hex.length ()==1) {   sb.append (“0”);   }   sb.append(十六进制);   }   返回sb.toString ();   }/* *   *异步下载图片的任务。   *   *   */类BitmapWorkerTask AsyncTask<延伸;字符串,空虚,Bitmap>{/* *   *图片的URL地址   */私人字符串imageUrl;      @Override   保护位图doInBackground(字符串…params) {   imageUrl=params [0];   FileDescriptor FileDescriptor=零;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

安卓二级缓存加载图片实现照片墙功能