2

ほとんどの UI で WebView で Javascript を使用する Android アプリを作成しています。一時ファイルを作成するための単純なインターフェースを JS に公開しました。Java では、ファイル ID を返す一時ファイルを作成する関数と、ID を指定して一時ファイルを操作する一連の関数を提供します。JS では、これらの関数を、独自の ID を内部的に追跡する TempFile オブジェクトでラップします。

これに関する問題は、Java 側にファイルのリストがありますが、Javascript でそれらを表すオブジェクトについて何も知らないことです。そのため、TempFile が JS で収集されるとき、ファイル オブジェクトは Java 側に残ります。収集されたTempFileに対応するファイルを解放するようにJavaに指示するために使用できる「oncollect」またはそのようなコールバックはありますか?

4

4 に答える 4

1

答えは「いいえ」だと確信しています。Java のファイナライザー (またはReferenceQueues) と同じ方法で JS ガベージ コレクション プロセスにフックすることはできません。

代わりに、これをより宣言的に処理できますか? あなたの質問は、ファイルが不要になったときにシステムが「知る」唯一の方法は、それがGCされたときです(つまり、システムはまったく知りません)。アプリケーション全体でこれらのファイルを本当に参照していますか? これらのリソースは、明確に定義されたライフサイクルで使用することをお勧めします。これにより、一時ファイルを作成するシステムの一部が、一時ファイルの使用が終了した後に破棄する責任も負います。

そのモデルでは、JS でファイルを (明示的に) 破棄すると、Java にコールバックして必要なクリーンアップを実行できます。

現在行っているように、単にリソースへのすべての参照を削除してリソースを解放することは、特に良い方法ではありません。

于 2012-08-08T12:05:47.413 に答える
0

Javascript にはそのようなフックはありません。

このユースケースでは、明示的に close() 関数またはそのようなメソッドを作成して呼び出す必要があります。

もう少し情報

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

于 2012-08-08T12:03:35.403 に答える
0

いいえ。ファイルが不要になったら、JavaScript から Java 関数を呼び出す必要があります。

于 2012-08-08T12:03:23.317 に答える
0

見るFinalizer

ES12以降、見つけることができますFinalizationRegistry。これを使用して、収集された TempFile に対応するファイルを解放するように Java に指示します。

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 に答える