Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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中,对于finally块下的代码: 1548 finally { 1549 /* 1550 * clean-up everything... 1551 */ 1552 synchronized (sGLThreadManager) { 1553 stopEglSurfaceLocked(); 1554

在android中,对于finally块下的代码:

1548 finally {
1549                /*
1550                 * clean-up everything...
1551                 */
1552                synchronized (sGLThreadManager) {
1553                    stopEglSurfaceLocked();
1554                    stopEglContextLocked();
1555                }
1556            }
这是否意味着它将由“FinalizerDamon”运行

当trace.txt显示FinalizerDaemon正在等待引用队列时,这意味着什么

  "FinalizerDaemon" daemon prio=5 tid=7 WAIT
  | group="system" sCount=1 dsCount=0 obj=0x419d0c60 self=0x50cf3650
  | sysTid=3933 nice=0 sched=0/0 cgrp=apps handle=1086157112
  | schedstat=( 0 0 0 ) utm=32 stm=9 core=1
  at java.lang.Object.wait(Native Method)
  - waiting on <0x416da5d0> (a java.lang.ref.ReferenceQueue)
  at java.lang.Object.wait(Object.java:401)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
  at java.lang.Thread.run(Thread.java:856)
“FinalizerDaemon”守护程序prio=5 tid=7 WAIT
|group=“system”scont=1 dsCount=0 obj=0x419d0c60 self=0x50cf3650
|sysTid=3933 nice=0 sched=0/0 cgrp=apps handle=1086157112
|schedstat=(0)utm=32 stm=9 core=1
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.ReferenceQueue)
在java.lang.Object.wait(Object.java:401)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
位于java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
运行(Thread.java:856)

最后
和终结器不相关

finally
try
-
catch
块之后的一个代码块,无论
try
-
catch
的结果如何,它都将运行。通常,您会在这里找到防止资源泄漏的关键清理代码

清理对象时,垃圾收集器可以运行终结器(对象的
finalize()
方法)。但是,你不能保证它们会运行,也不能保证它们以任何顺序运行,等等

FinalizerDamon可能是运行
finalize()
方法的线程。在本例中,它听起来像是阻塞了
ReferenceQueue
,该队列将保存对符合最终确定条件的对象的引用


值得一提的是,这里没有特定于Android的行为;这只是Java行为。

最终在try-catch块的末尾执行,而不管是否发生异常


FinalizerDamon与此无关。它与垃圾收集有关。

finally是try/catch块的一部分,无论是否引发异常,它都会运行。FinalizerDamon与垃圾回收有关。如果仅此而已,那么将其放在catch块下面还是放在finally块中就无关紧要了。:)但还有更多:如果@Frank有更多的东西,你需要指出这里有什么。:)最重要的是:你可以使用它而不被捕获,它会一直运行(除非发生可怕的事情)。也包括未捕获的例外情况。此外,如果在代码中的某个地方手动调用“return X”,它仍然会运行finally。因此,对于清理/关闭对象来说,它是完美的:如果未来的开发人员在方法中的某个地方添加了return语句:不用担心,finally仍然会运行。