Android游戏因GLThread引用而内存泄漏
现在我正在用Android(OpenGL ES 1.1)开发一个游戏,我看到每当我创建一个新的SurfaceView(GLView)时,它的线程都会被创建。没关系。当我想完成保存SurfaceView(并返回菜单)的活动时,问题就出现了。活动似乎没有被释放,因为每个GLThread都在引用它。这可能会以OOM错误结束 一些图片: 第一幅图:MarkitActivity表示处理SurfaceView的每个活动实例 第二张图片:记忆中所有活动的列表 第三幅图:GC的活动是什么 如果需要任何代码,我会发布它。然而,我已经尝试了以下几点: ->活动上下文对渲染器和surfaceview的引用较弱 ->应用程序上下文而不是活动上下文(在正常和弱模式下) ->试图停止(以一种困难的方式)线程(中断)并等待join(程序执行该操作,但线程不关心,它仍然在那里…) ->在不调试的情况下尝试,以防在调试器模式下值发生更改(MAT图片没有调试器) ->以单实例模式尝试该活动。奇怪的结果和错误无处不在 ->onPause和onResume对视图进行了正确控制 任何提示、想法、问题或帮助都将不胜感激。提前谢谢Android游戏因GLThread引用而内存泄漏,android,opengl-es,memory-leaks,surfaceview,Android,Opengl Es,Memory Leaks,Surfaceview,现在我正在用Android(OpenGL ES 1.1)开发一个游戏,我看到每当我创建一个新的SurfaceView(GLView)时,它的线程都会被创建。没关系。当我想完成保存SurfaceView(并返回菜单)的活动时,问题就出现了。活动似乎没有被释放,因为每个GLThread都在引用它。这可能会以OOM错误结束 一些图片: 第一幅图:MarkitActivity表示处理SurfaceView的每个活动实例 第二张图片:记忆中所有活动的列表 第三幅图:GC的活动是什么 如果需要任何代码
Carlos.我在线程方面也遇到了类似的问题(但没有使用OpenGL),最后用一个简单的技巧解决了这个问题 在退出活动之前(在
onPause()
或onStop()
中),请尝试按如下方式清空线程:
myThread = null;
它似乎使线程
GC变得可收集,因此您的活动也变得可收集
这对我和一些有类似问题的人都有效,我也给了他们同样的建议
问候。嗨,路易斯,谢谢你的快速回答。这里的主要问题是我无法访问线程本身(或者至少无法访问循环和保持其活动的主变量,它位于Android内核中)。我没有使用OpenGL的经验,但您可以尝试将包含线程引用的GL顶级元素(可能是您的GLSURFACHEVIEW或ClearRenderer对象)置零。已经尝试过,线程仍然处于活动状态,因此它仍然具有引用。:(嗨!您找到解决此问题的方法了吗?因为我目前正遇到完全相同的问题(只有在旧版本的Android上,Android 4.2.2有不同的行为)。