Added in API level 30

CloseGuard


class CloseGuard
kotlin.Any
   ↳ android.util.CloseGuard

CloseGuard is a mechanism for flagging implicit finalizer cleanup of resources that should have been cleaned up by explicit close methods (aka "explicit termination methods" in Effective Java).

A simple example:

<code>class Foo {    private final CloseGuard guard = new CloseGuard();    ...    public Foo() {  ...;  guard.open("cleanup");  }    public void cleanup() {  guard.close();  ...;  if (Build.VERSION.SDK_INT &gt;= 28) {  Reference.reachabilityFence(this);  }  // For full correctness in the absence of a close() call, other methods may also need  // reachabilityFence() calls.  }    protected void finalize() throws Throwable {  try {  // Note that guard could be null if the constructor threw.  if (guard != null) {  guard.warnIfOpen();  }  cleanup();  } finally {  super.finalize();  }  }  }  </code>
In usage where the resource to be explicitly cleaned up is allocated after object construction, CloseGuard protection can be deferred. For example:
<code>class Bar {    private final CloseGuard guard = new CloseGuard();    ...    public Bar() {  ...;  }    public void connect() {  ...;  guard.open("cleanup");  }    public void cleanup() {  guard.close();  ...;  if (Build.VERSION.SDK_INT &gt;= 28) {  Reference.reachabilityFence(this);  }  // For full correctness in the absence of a close() call, other methods may also need  // reachabilityFence() calls.  }    protected void finalize() throws Throwable {  try {  // Note that guard could be null if the constructor threw.  if (guard != null) {  guard.warnIfOpen();  }  cleanup();  } finally {  super.finalize();  }  }  }  </code>
When used in a constructor, calls to open should occur at the end of the constructor since an exception that would cause abrupt termination of the constructor will mean that the user will not have a reference to the object to cleanup explicitly. When used in a method, the call to open should occur just after resource acquisition.

Summary

Public constructors

Constructs a new CloseGuard instance.

Public methods
Unit

Marks this CloseGuard instance as closed to avoid warnings on finalization.

Unit
open(closeMethodName: String)

Initializes the instance with a warning that the caller should have explicitly called the closeMethodName method instead of relying on finalization.

Unit

Logs a warning if the caller did not properly cleanup by calling an explicit close method before finalization.

Public constructors

CloseGuard

Added in API level 30
CloseGuard()

Constructs a new CloseGuard instance. open(java.lang.String) can be used to set up the instance to warn on failure to close.

Public methods

close

Added in API level 30
fun close(): Unit

Marks this CloseGuard instance as closed to avoid warnings on finalization.

open

Added in API level 30
fun open(closeMethodName: String): Unit

Initializes the instance with a warning that the caller should have explicitly called the closeMethodName method instead of relying on finalization.

Parameters
closeMethodName String: non-null name of explicit termination method. Printed by warnIfOpen.
Exceptions
java.lang.NullPointerException if closeMethodName is null.

warnIfOpen

Added in API level 30
fun warnIfOpen(): Unit

Logs a warning if the caller did not properly cleanup by calling an explicit close method before finalization.