ChillingVan / android-openGL-canvas

An Android library that provides views using openGL canvas to draw things on SurfaceView or TextureView.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

如何解决在退出Activity后GLTextureView无法自动回收

icebuf opened this issue · comments

使用您的Demo,和AS自带的分析器观察:在退出应用后,系统自动gc了两次,但是还是有很大一部分内存未被回收,dump后发现未被回收的主要是TextureView里mCanvas的Bitmap对象,求教如何解决这个问题。

请问你看的是哪个界面?除了OffScreenActivity忘了onResume onPause外,其它基本上都能看到内存已经回收了。 GLCanvas里用的是WeakHashMap来管理bitmap的

DrawText那个页面,我这边用模拟器和真机测试都无法完全回收,也看了你那个回收时调用final()方法,尽管那个方法有时候确实被调用了但是还是无法回收,我这边机型是华为荣耀9,还有一个问题等下我再开一页说明。

视频打不开呀..

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><RequestId>5BEA4E2920FB5E8025044EEE</RequestId><HostId>bflyff.oss-cn-beijing.aliyuncs.com</HostId><OSSAccessKeyId>TMP.AQHmEmFHdXW9HFzKNcLR5R6hO83pNo6JzZ0oUjgaM77F0WHDc8wYnvKpCElHADAtAhQdV1jYWcEOOQbe2TZ2AHo9IZ7xdAIVAK9EtXq_RLtL4glER1Kao9SogbQh</OSSAccessKeyId><SignatureProvided>OPcXwrwZsAE1YjADcf/cpK/BMRE=<https://bflyff.cn/video/test.mp4?Expires=1542136622</SignatureProvided><StringToSign>GET


1542137974
/bflyff/video/SVID_20181113_084807.mp4</StringToSign><StringToSignBytes>47 45 54 0A 0A 0A 31 35 34 32 31 33 37 39 37 34 0A 2F 62 66 6C 79 66 66 2F 76 69 64 65 6F 2F 53 56 49 44 5F 32 30 31 38 31 31 31 33 5F 30 38 34 38 30 37 2E 6D 70 34 </StringToSignBytes></Error>

我的结果还是好的:
image
这一张图是打开DrawTextActivity后录的内存,可以看到有DrawTextActivity

image

然后是关闭这个Acitivty几十秒后的,没点force gc,可以看到还在

image

然后狂点了好几次gc,可以看到没有了。CanvasGL对象也没有了。但还能看到有剩余2张Bitmap,原本有10张Bitmap。

这个还有问题吗?

嗯嗯,那可能 private Map<Bitmap, BasicTexture> bitmapTextureMap = new WeakHashMap<>();这Map限制一下数量,或加一下有效时间好一点

我重现不了你说的不断开启关闭会OOM。因为WeakHashMap的内容在内存不足时肯定会被回收的。我在AnimActivity里解码数十张图片绘制,内存占到100多M了,只要退出,内存就会立刻降,反复打开关闭10多次都不会出现OOM。
是不是还需要什么触发条件?

那就好