看看下面的链接:GLSurfaceView code sample
具体来说,请在该页面的第二个代码块中查看以下功能:
public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable() {
public void run() {
mRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
}
});
return true;
}
让我感到困惑的是,匿名Runnable引用了非常本地的“事件”对象,但是queueEvent实际上最终在完全独立的线程上运行Runnable,因此很可能在该“事件”的特定实例死掉很久之后,显然是一个问题。还是在“事件”对象的引用计数上实际对“onon类内部的局部引用”使用了某种+1,以便只要Runnable仍在呼吸,它就一直存在?
另外,MotionEven被宣布为最终决定是否与所有这些都有关?
P.S.
作为一个相关的问题(尽管这不是我的主要关注点),如果不是(或者除了)“事件”我们想要在anon类中引用诸如“int x”之类的原语,那又会怎样呢? (看来您无法+1原语的引用计数)。
最佳答案
Java不使用引用计数来进行垃圾回收。我对JVM如何实现这种关闭不是很了解,但是我只能假定匿名类实例包含对event
的引用。在这种情况下,只要匿名Runnable处于 Activity 状态,那么它引用的所有内容都会处于 Activity 状态(并且那些引用的所有内容都处于 Activity 状态,等等,等等)。
至于原始类型,它们只是直接复制到字段中。因此,只要存在被引用然后被垃圾收集的东西,就没有“引用”。它们只是包含它们的对象的一部分。每次您对int 287进行“新引用”时,并不是说您现在已经有了另一个存储引用的地方,即287,您只是有了另一个存储287的存储字。因此,当您使用287时,这并不重要原来是从您那里获得的,而您是完全独立的。