精华内容
下载资源
问答
  • 安卓图片缓存技术

    千次阅读 2016-03-20 11:19:19
    概述:随着手机硬件水平的提高及摩尔效应带来的成本的降低,用户手机上的图片的分辨率越来越高,而对于移动终端而言内存存在一定的限制的,如果程序占用过高的内存,也会抛出OOM异常,降低了APP的用户体验。...

    概述:随着手机硬件水平的提高及摩尔效应带来的成本的降低,用户手机上的图片的分辨率越来越高,而对于移动终端而言内存存在一定的限制的,如果程序占用过高的内存,也会抛出OOM异常,降低了APP的用户体验感。另外自己做的APP应该尽可能的减少安装包的体积。本博客主要讲述通过压缩图片来减少安装包体积和通过使用图片缓存技术来高效加载大图。

    一 压缩图片:

         在加载高分辨率图片的时候,最好先将图片进行压缩,一般情况下将图片压缩到大小与展示该图片的控件的大小差不多就可以。比如说:我们常用的腾讯QQ,在展示用户图像的控件上显示的实际上是压缩过的用户上传后的图片,当你要查看自己上传高清图像时,腾讯专门提供了一个查看大图的功能,此时才会将用户上传的图片显示出来,这样做的目的当然是为了减少程序占用的内存。

    压缩图片主要是用到了安卓BitmapFactory.Options类,主要是通过设置options.inJustDecodeBounds = true; 这样就能在不将该bitmap加载到内存的情况下获得该图片的大小方面的属性,如:options.outHeight,options.outWidth。这样就可以根据需求对这些大小属性进行相应的压缩操作,记得在压缩操作完成后要设置options.inJustDecodeBounds = false;代码如下:
    /**@author htq
     * 在该方法中对图片进行压缩,可以减少加载图片时占用的java内存。
     * @param path
     * @return
     */
    	private Bitmap loadBitmapFromLocal(String path) {
    		if (path == null) {
    			return null;
    		}
    		
    		BitmapFactory.Options options = new Options();
    		options.inJustDecodeBounds = true;
    		Bitmap bitmap = BitmapFactory.decodeFile(path, options);
    		float height = 800f;
    		float width = 480f;
    		float scale = 1;
    		if (options.outWidth > width && options.outWidth > options.outHeight) {
    			scale = options.outWidth / width;
    		} else if (options.outHeight > height
    				&& options.outHeight > options.outWidth) {
    			scale = options.outHeight / height;
    		} else {
    			scale = 1;
    		}
    		options.inSampleSize = (int) scale;
    		options.inJustDecodeBounds = false;
    		bitmap = BitmapFactory.decodeFile(path, options);
    		bitmap = decodeBitmap(bitmap);
    		if (!imgCaches.containsKey(path)) {
    			//imgCaches.put(path, new SoftReference<Bitmap>(bitmap));
    			addCache(path, bitmap);
    		}
    		return bitmap;
    	}

    除了减少图片占用程序运行的java内存外,还可以对图片进行质量压缩,不会减少图片的像素,所以转化为bitmap后java内存占用与压缩前相同,但可以用来减少图片的大小,即减少图片占用的磁盘空间。代码如下:
    /**@author htq
    	 * 该方法是对图片进行质量压缩,不会减少图片的像素,所以转化为bitmap后java内存占用与压缩前相同
    	 * 仅仅用来减少图片的大小。
    	 */
    	private Bitmap decodeBitmap(Bitmap bitmap) {
    		int scale = 100;
    		ByteArrayOutputStream bos = new ByteArrayOutputStream();
    		bitmap.compress(Bitmap.CompressFormat.JPEG, scale, bos);
    		while ((bos.toByteArray().length / 1024) > 30) {
    			bos.reset();
    			bitmap.compress(Bitmap.CompressFormat.JPEG, scale, bos);
    			scale -= 10;
    		}
    		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    		bitmap = BitmapFactory.decodeStream(bis);
    		return bitmap;
    	}


    二 使用图片缓存技术来高效加载大图
         2.1使用软引用来缓存图片:主要是通过一个HashMap来将图片路径和图片资源(用软引用表示)关联起来。代码如下:
     private static HashMap<String, SoftReference<Bitmap>> imgCaches;
     imgCaches = new HashMap<String, SoftReference<Bitmap>>();
              具体加载图片步骤如下:
             1.通过path路径查看缓存中是否存在该图片,如果存在,则直接加载,如果不存在,则开启一个子线程从网络中获取。
    2.图片下载完成后,将该图片放入到缓存中,供下次查询时使用。具体代码如下:

    	public void loadBitmap(final String path,
    			final OnLoadBitmapListener listener) {
    		final Handler handler = new Handler() {
    			@Override
    			public void handleMessage(Message msg) {
    				super.handleMessage(msg);
    				Bitmap bitmap = (Bitmap) msg.obj;
    				listener.loadImage(bitmap, path);
    			}
    		};
    		new Thread() {
    
    			@Override
    			public void run() {
    				executorThreadPool.execute(new Runnable() {
    					@Override
    					public void run() {
    						Bitmap bitmap = loadBitmapFromCache(path);
    						if (bitmap != null) {
    							Message msg = handler.obtainMessage();
    							msg.obj = bitmap;
    							handler.sendMessage(msg);
    						}
    
    					}
    				});
    			}
    
    		}.start();
    	}


    
    
    
    
    

        2.2内存缓存技术:主要是通过LruCache这个类来缓存图片,故名思意可知,当缓存的图片达到了预先设定的值的时候,那么近期使用次数最少的图片就会被回收掉。

    使用该类时要预先设置缓存图片内存大小,且必须重写该类的sizeof()方法,默认返回图片数量。代码如下:

    private LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
    		@Override
    		protected int sizeOf(String key, Bitmap bitmap) {
    			// 重写此方法来衡量每张图片的大小,默认返回图片数量。
    			return bitmap.getByteCount() / 1024;
    		}
    	};

    与上述使用软引用来加载缓存图片类似,首先会在 LruCache 的缓存中进行检查。如果找到了该图片的缓存,则直接加载,否则开启一个后台线程来加载这张图片。代码如下:
    <pre name="code" class="html">public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {
            if (mMemoryCache.get(key) == null) {
                if (key != null && bitmap != null)
                    mMemoryCache.put(key, bitmap);
            } else
                Log.w(TAG, "the res is aready exits");
        }
    
        public synchronized Bitmap getBitmapFromMemCache(String key) {
            Bitmap bm = mMemoryCache.get(key);
            if (key != null) {
                return bm;
            }
            return null;
        }

    /**
         * 移除缓存
         * 
         * @param key
         */
        public synchronized void removeImageCache(String key) {
            if (key != null) {
                if (mMemoryCache != null) {
                    Bitmap bm = mMemoryCache.remove(key);
                    if (bm != null)
                        bm.recycle();
                }
            }
        }


    
    
            
       


    展开全文
  • 为进一步揭示硅对稻瘟病的结构抗性,以纳米SiO2为硅源,以对...通过透射电镜图片还可看到,在水稻叶片内形成的矿化硅材料将病菌菌丝包围,减少了稻瘟病菌对水稻的侵染。施硅能够有效地抑制稻瘟病菌的人侵,从而增强水稻
  • 随着分数的增加,允许的响应时间会减少,给出每个方向之间的时间也会减少。 得分较高时,会出现奖励案例(重新排列按钮、在给定时间限制内敲击/摇动的次数),以及 3 个序列随机组合方向。 用户的游戏表现在 SQLite...
  • 减少数据库的访问量,同时提高用户的体验,我们在每次用户进入小程序是,就对数据库进行了查询,将满足要求的所有数据放入到一个数组中,每个页面按照每个地点的type值进行分类存入各自数组,给予了不同的全局...
  • 2. 每个元素的存在都必须合情&合理、删除一切可有可无的元素。至精:1. 画面的每个象素都要有品质;2. 最后存留下来的每个元素都要精挑细选,精雕细琢。艺帆CMS是由艺帆互联开发,用于服务广大互联网工作者.简单...
  • 充满艺术的浮雕效果和变形功能让图片变成生动的立体图形 极富操作乐趣的学习 这不是简单意义上的教程,“边学边用”内嵌于中望3DTM软件之中,学习者可以一边观看学习示例,一边操作软件;操作提示、功能介绍皆在...
  • 你可以“删除”(隐藏)一个不兴趣的消息,使其不会在你眼前闪烁。 在响应字段中输入文本时,可以随时关闭应用程序窗口,关闭计算机等。文本将保持存储,您可以在任何随后的方便时刻继续写答案。 通过扩展的答案还...
  • // 加载完的图片对象都缓存在这里了,canvas可以直接绘制 img: image, // 这里可以直接生成并缓存离屏canvas,用于优化性能,但本次不用,只是举个例子 offScreenCanvas: this....
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    在Jamendo程序中,有一个很明显的特征是存在一个全局的JamendoApplication类,此类继承自Application,此类的作用主要是实现应用程序集的全局变量,也就是在任何一个Activity中都可以访问的变量。它不会因为Activity...
  • 项目中使用的 图片素材 来自 UnSplash 提供的 免费授权图片。 项目中使用的 音频素材 来自 BenSound 提供的 免费授权音乐。     Who is using 感谢小伙伴们对 “开源库使用情况” 匿名调查问卷的参与,截至 2021...
  • 读取速度就越慢</li><li>对象在原型链中存在的位置越深,找到它的速度就越慢</li></ul> 推荐的做法是缓存对象成员值。将对象成员值缓存到局部变量中会加快访问速度 <h3>2.2 DOM 应用在运行时,性能的...
  • 界面库产品应该对图片等资源加载做优化,以尽可能的减少界面库加载等带来的时间开销。也可以通过比较软件启动速度来 比较界面库的效率。  软件色调调整时的效率 色调调整等操作一般会涉及到整体界面库的运算与...
  • 界面库产品应该对图片等资源加载做优化,以尽可能的减少界面库加载等带来的时间开销。也可以通过比较软件启动速度来 比较界面库的效率。  软件色调调整时的效率 色调调整等操作一般会涉及到整体界面库的运算与...
  • 中文加注版比官方版无新增文件,只多了一个zzz的目录,里面放了一些图片/文件/工具,它与内核代码无关,大家可以忽略它,取名zzz是为了排在最后,减少对原有代码目录级的侵入,zzz的想法源于微信中名称为AAA的那帮...
  • 这里有一张互联网公司面试中经常考察的问题类型总结的思维导图,我们可以结合图片中的信息分析一下。 (图片来自 leetcode) 其中算法,主要是以下几种: 基础技巧:分治、二分、贪心 排序算法:快速排序、归并...
  • url是图片路径,这样绑定后,这个ImageView就会去显示这张图片,不限网络图片还是本地图片。 如果需要给一个默认加载中的图片,可以加这一句 binding:placeholderRes="@{R.mipmap.ic_launcher_round}" R文件需要在...
  • 转来备用,以后慢慢学

    2010-05-21 14:14:33
    如果你最近拷贝了一张图片存在剪贴板里,Photoshop在新建文件(Ctrl+N)的时候会以剪贴板中图片的尺寸作为新建图的默认大小。要略过这个特性而使用上一次的设置,在打开的时候按住Alt键(Ctrl+Alt+N)。¬  21. 如果...
  • 由于客户端的硬件配置可能存在差异,软件环能各不相同,因此,在安装时,必须对每一个客户端分别进行配置,同样,在软件升级时也要对客户端分别处理。 B/S模式带来了巨大的好处: 开发成本及维护成本降低。由于B/S...
  • 由于客户端的硬件配置可能存在差异,软件环能各不相同,因此,在安装时,必须对每一个客户端分别进行配置,同样,在软件升级时也要对客户端分别处理。 B/S模式带来了巨大的好处: 开发成本及维护成本降低。由于B/S...
  • 学语法,学技巧,学开发,这些其实都是为了能开发出通用产品,然后为人民服务,促进社会发展,减少重复劳动,创造价值。 当对某个语法,程序的性能、功能等等都没兴趣了,就会对软件产品有兴趣了,没有行业知识就做...
  • asp.net知识库

    2015-06-18 08:45:45
    鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署...
  • 更快速的流通和低廉的价格:电子商务减少了商品流通的中间环节,节省了大量的开支,从而也大大降低了商品流通和交易的成本。 更符合时代的要求:如今人们越来越追求时尚、讲究个性,注重购物的环境,网上购物,更能...
  • Egret 的 童话 与 现实

    2021-01-03 14:33:25
    但是它的好处大多数也仅仅体现在『有助于减少在编码期因失误造成的拼写错误等低级错误的发生』。也许有人会说,这个好处已经足够了,配合强大的IDE可以更好的开发复杂的企业级项目,尤其那种大型...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

存在感减少图片