2

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

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

4

4 回答 4

1

我相当肯定答案是“否”——你不能像使用 Java 的终结器(或ReferenceQueues)一样挂接到 JS 垃圾收集过程。

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

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

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

于 2012-08-08T12:05:47.413 回答
0

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

于 2012-08-08T12:03:23.317 回答
0

Javascript 没有这样的钩子。

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

更多信息

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

于 2012-08-08T12:03:35.403 回答
0

看着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并将 js 'tempFile' 附加到它使用.register. 一旦“tempFile”被垃圾收集,传递给该FinalizationRegistry方法的回调函数就与java进行通信。

可能重复

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

于 2022-01-15T01:34:49.073 回答