Javascript 对象可以有“垃圾收集时”回调吗?

问题描述 投票:0回答:4

我正在编写一个 Android 应用程序,它在 WebView 中使用 Javascript 来实现大部分 UI。我向 JS 公开了一个简单的接口来创建临时文件。在 Java 中,我提供了一个创建临时文件的函数,该函数返回一个文件 ID,以及一组在给定 ID 的情况下对临时文件进行操作的函数。在 JS 中,我用 TempFile 对象包装这些函数,该对象在内部跟踪其自己的 ID。

这样做的问题是 Java 端有一个文件列表,但对 Javascript 中表示它们的对象一无所知。因此,当在 JS 中收集 TempFile 时,文件对象仍然存在于 Java 端。是否有一个“oncollect”或这样的回调,我可以用它来告诉 Java 释放与已收集的 TempFile 相对应的文件?

javascript android webview garbage-collection
4个回答
3
投票

Finalizer

ES12 起,您可以找到

FinalizationRegistry
。用它告诉 Java 释放与已收集的 TempFile 对应的文件。

const registry = new FinalizationRegistry((fileName) => {
    console.log(fileName);
    // ... here your function to comunicate with Java
});
let tempFileObject;
registry.register(tempFileObject, filename);

这里我们创建一个

FinalizationRegistry
的实例,并使用
.register
将 js 'tempFile' 附加到它。一旦“tempFile”被垃圾回收,传递给
FinalizationRegistry
方法的回调函数就会与 java 进行通信。

可能重复

如何实现 JavaScript 对象被垃圾回收时触发的函数?


0
投票

我相当肯定答案是“不”——你不能像使用 Java 的终结器(或

ReferenceQueues
)一样连接 JS 垃圾收集过程。

您能否以更声明的方式处理这个问题?您的问题似乎暗示您的系统“知道”何时不再需要文件的唯一方法是何时对其进行 GC(或者换句话说,您的系统根本不知道)。您真的在整个应用程序中引用这些文件吗?好的做法是在明确定义的生命周期中使用这些资源,这样系统中创建临时文件的部分也负责在使用完毕后销毁它。

在该模型下,当您(显式)在 JS 中销毁文件时,您可以回调 Java 来执行所需的清理。

通过简单地删除对资源的所有引用来释放资源(就像您目前所做的那样)并不是特别好的做法。


-1
投票

不。当您不再需要这些文件时,您需要从 JavaScript 调用 Java 函数。


-1
投票

Javascript没有这样的钩子。

您需要为此用例显式创建 close() 函数或此类方法并调用它。

更多信息

http://forums.mozillazine.org/viewtopic.php?f=19&p=5517055

© www.soinside.com 2019 - 2024. All rights reserved.