24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > 安卓开发

【常州安卓开发培训班】常用工具和第三方库汇总3

2018-05-02 17:11:18 东方博宜 阅读

提示


我已经提到我在 Pinterest 工作,而且图像对我的工作很重要。我必须扔出一堆关于图像的提示。


人们都没有做最简单的事情,因为这些库没有这样做,这件简单的事情就是在列表中预取。每当你滚动列表时,你都会看到图像在加载。如果你预取了下一个或两个图像,那么当你滚动时,将会减少帧丢失。这会给你带来更好的体验,不需要等待加载了。如果你预取的图像太多,资源就会竞争,也不好,但预取下一个或两个图像一定会带来更好的体验。


除此之外,这些库都不能解决你图像的内存问题。最简单的做法是禁用图像,然后计算出应用程序中的图像消耗了多少内存。不使用图像,计算出省下的内存消耗。另外,释放没有显示图像的图像,并将图像的大小调整为你显示的尺寸也可以帮助节省内存。 Cloudinary 是一个很酷的托管服务,你可以以特定的分辨率请求图像。他们努力做到这点。但是,当你调整请求的图像大小时,你必须确保你没有通过请求类似的图像来破坏缓存(所以这里有个平衡)。


我是 bigHeap 的粉丝。我们的一个的应用程序,使用了 bigHeap 后,内存崩溃降到原来的 1/4。 Google 不鼓励使用它,因为它关闭了在后台的其他应用程序,因此应用程序之间的切换并不是那么好。但在某些时候,这不是你的问题。垃圾回收也需要更长时间,你可以使用它来屏蔽内存问题(你不应该这么做)。一般来说,bigHeap 是好的。如果你去 Play Store,并且搜索 largeHeap,你可以下载一个很酷的应用程序,它会显示你手机上启用了 bigHeap 的应用程序。你会注意到现在几乎每个人都陷入了困境,并且正在使用 bigHeap。


当你想到内存和图像时,这里有一个简单的公式。有些人会问,“这是个两千字节的 JPEG,为什么我的实际使用的内存会这么大呢?” 使用的内存是像素宽度乘以像素高度的四倍。这就是你期望的大小。它们的标准格式是 ARGB_8888 - 它用四个字节存储颜色空间。如果你使用 RGB_565,你可以将其减少到两倍。但是颜色彼此会非常相似,你会看到更少的色彩空间,它也不能做 alpha,但它会减少一半的内存使用量。你可以考虑在低端设备或低版本 API 上进行此操作。这是节省内存不足问题的好方法。


Fresco


Facebook 发布了一个神奇的库,解决了 API 21 之前的所有版本的内存不足问题。在 API 21 之前,Android 系统中出现了一个错误,你可以在应用程序内存之外使用其他的内存。但是会带来些奇怪的情况:你的程序在旧设备上没有问题,但在新设备上会表现更糟。因为它加载的方式与其他库非常不同,所以它可以实现渐进式 JPEG 这样的图像,图像在图层中逐渐加载。但是,它们会更深入地耦合在你的应用程序中。借助 Glide 和 Picasso,你可以将其与你的应用隔离的很好。而不使用 imageViews,你必须使用它们的类型 Drawees,并且还会产生更多的孤岛代码。


如果你定位较低端的设备,你在旧设备上有更多的内存需求,我建议你使用 Fresco。除此之外,我会坚持 Picasso 和 Glide。


内存 - 泄漏



LeakCanary


LeakCanary 是当今内存泄露的神器,它可以帮助你找到内存泄露的地方。泄漏不是所有的内存问题,但是值得留意。当你将 LeakCanary 添加到应用程序中时,它会自动开始观察你的 activity 的内存泄漏。有一个我亲眼所见的误用是,他们将 LeakCanary 添加到应用程序中。修复一个或两个泄漏,然后就认为再没有更多的内存泄漏了。它只监视了 activity。如果你在这里使用这个代码(看幻灯片),你可以让它监视 fragment。这并不意味着你不会在别处泄漏内存。activity 和 fragment 是监测的好地方,但如果你没有将观察者设置为对象,你是不知道所有的泄露的。


简单来说,它的工作原理很酷。作为你引用的任何对象的弱引用:将其附加到你不再被引用的内容中。你把它放在 destroy 代码段。然后它做垃圾回收。如果对象仍然存在,这就是内存泄漏,所以它知道什么对象依旧存在。它给你那个 home fragment 现场的相关引用。我觉得这很难理解(*有些人认为这很简单,有人认为这很难。)


这里有个 view 的例子来做点简单说明(见幻灯片)。你从底部开始(这就是泄露的东西)。我有 home fragment。 它被 pin grid fragment 引用 - pin grid fragment 是这个对象的父亲。然后我们有这个奇怪的$ 0 - 它解释说,这是一个可运行的对象。对象内有一个处理程序包含一个 runnable。这段代码(这不是我的),它是 Android 操作系统的,是处理程序的代码。处理程序有个 runnalbe 正在运行。我需要确保处理程序不再保留 runnable。在这种情况下,我可以在视图的 destroy 中清除所有的 runnable 和处理程序,这将修复这个内存泄漏。

常州东方博宜是一家专注IT,互联网,电脑方面的顶尖培训机构,欢迎社会及院校有志互联网营销,搜索引擎营销的人士,来东方博宜报名学习,互相交流。

常州东方博宜地址:常州天宁区延陵西路2号工人文化宫5号楼

 2.新北区太湖东路9-4号常州创意园E12


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2018 www.czos.cn