Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 月球着陆器中的Android垃圾收集_Java_Android - Fatal编程技术网

Java 月球着陆器中的Android垃圾收集

Java 月球着陆器中的Android垃圾收集,java,android,Java,Android,在月球着陆器示例(由谷歌的Android站点提供)中,在一个名为“run()”的方法中有一个主循环。以下是: @Override public void run() { while (mRun) { Canvas c = null; try { c = mSurfaceHolder.lockCanvas(null);

在月球着陆器示例(由谷歌的Android站点提供)中,在一个名为“run()”的方法中有一个主循环。以下是:

        @Override
        public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        if (mMode == STATE_RUNNING) updatePhysics();
                        doDraw(c);
                    }
                } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

所以现在,我的问题是:每次循环都保持c为空,从而导致更多的垃圾收集,这不是很糟糕吗?也许我不太明白这一点,但为什么它必须为null?

这一点也不错,它确保了画布对象在重新创建时具有0或null引用。这是很好的编程实践

还要注意finally语句,它确保如果存在有效的Canvas对象,那么它将被清除。如果它为null,那么将其重置为null没有任何缺点。不需要处罚或额外清理。记住一个对象有一个地址,对null的引用确保它不指向可能潜伏在周围(尚未清理)的某个有效对象


此外,当您将变量初始化为null时,不会调用垃圾收集器。它只是意味着对象不引用当前内存中的任何内容。

最初将c赋值为null不会导致垃圾收集器运行。C没有指向对象,因此没有要收集的内容。你要做的就是确保它不指向任何东西。此外,c指向的canvas对象可能还有其他引用,这意味着仅仅因为c不再指向它,并不一定意味着它已经准备好被收集。

如果您指的是行
canvas c=null-它与GC完全无关。这是本地画布引用
c
的初始化,因此代码可以编译。

在循环中重新创建对象不会导致垃圾收集吗?@Eugene-如果您正在实例化对象并为其分配内存,那么是的。您将强制定期进行垃圾回收以释放该内存。android网站在你的应用程序中称这些为“打嗝”。但是给一个对象分配一个空值不是一回事。好吧,我想我从每个人的回答中都明白了。谢谢你的帮助!什么是0引用(在Java上下文中)?Steve抱歉,0不是一个好例子,我的观点是试图解释null,好像它是一个整数类型一样。如果这可能是使用整数计算总数,则可以将总数重置为0。