工作小结-2018十一月

本周的主要工作是完成了medel放大,手势滑动,以及分享到app等功能。

medel放大主要使用的是photoview的改写版本,因为产品要求不支持反转,因此读了一下代码去掉了反转的操作,放大的弹性指数用的是正常的2.5倍。medel放大,手势等等业务逻辑写的都比较简单。

这次medel的放大页面,需要使用viewpager进行滑动更改,因此这就需要了进行medel的bitmap缓存,按照以往的写法,这个地方应该写一个lrucache,配套SoftReference来使用,但是调试过程中发现了一些问题。

softreference是当内存不足的时候会被强制回收,lrucache里面携带的是linkedlist,直接使用key指向该软引用,lrucache里面会记录目前保留下来的数量,然后作对比。但是比较神奇的是,发现了lrucache里面记录的数量大于0,但是linkedlist里面size却为0了。做了两个对比,当不使用软引用,直接使用携带bitmap,发现并不会出现这种情况。关于这个问题查了一下,其实jvm并不希望我们使用软引用,因为无法确定何时回收比较好,因此此处回收的机制并不是当内存不足的时候才回收,由于给了1/8最大可用内存,因此此处应该是触发了一个最大内存限制,导致直接被强制回收了所有软引用的地方,导致发生了这个问题。另外实验了一下,在recyclerview中,当view被回收复用的时候,此时使用软引用就不会触发这个问题,因为当view被回收复用的时候,此时就会释放该部分指向,当这部分到了内存限制的时候回被自然的回收,但是viewpager中view不会被回收,而且我没有设置最大页面的offset,导致这个问题发生。

因此以后使用到软引用的时候,不能光认为是内存不足就会被回收,要做好直接被回收的准备,否则就不应该使用软引用。

另外这次关于medel的设计,是在spu详情页面,spu详情页面跳出medel预览,然后medel预览还可以跳转详情,这涉及一个无限跳转的问题,测试发现一个详情页面占用起码300M内存,但是如果是相同的大概只会增加100M,但是如果无限跳转肯定会导致内存不足的问题,从淘宝测试了一下,淘宝最多只允许三个页面跳转,因此我们也需要考虑到这个问题。

下个版本需要设计一下页面多级跳转的问题。目前思想是在activty栈里面做一些设置,在相同activity过多的时候,采取旧页面强制销毁的方式,然后启动新的页面,这样应该可以解决这个问题