Google I/O '17トークの「Hans Boehm」は、クラスを使用して、ネイティブピアが正しく削除されるようにすることを提案しています。一般的なPhantomReferenceクラスのネイティブピアを削除する
18 min 57 secのリンク先のビデオでは、PhantomReference
クラスに自身を登録しているオブジェクトの実装例を示しています。このPhantomReference
クラスでは、彼は19 min 49 secになります。だから私は彼のアプローチを私のサンプルオブジェクトにコピーしました。下記参照。
このアプローチは問題なく機能しますが、縮尺は変わりません。かなりの量のオブジェクトを作成する必要があります。オブジェクトを取得し、ネイティブの削除を適切に処理する基本クラス(自分のオブジェクト用またはPhantomReference
基本クラス)を作成する方法が見つかりませんでした。
付属のネイティブ静的メソッドを呼び出すことができる汎用ベースPhantomReference
クラスを作成するにはどうすればよいですか?
PhantomReference
genericを変換しようとしましたが、ネイティブの静的な削除方法が実装を妨げています。
私のあなたはPhantomReference
を中心に構築された同様のタスク、クリーンアップに取り組むJavaの9のCleaner
API、見ていると、同じようなことを実現することが私のWorkViewModelPhantomReference
import java.lang.ref.*;
import java.util.*;
public class WorkViewModelPhantomReference extends PhantomReference<WorkViewModel>
{
private static Set<WorkViewModelPhantomReference> phantomReferences = new HashSet<WorkViewModelPhantomReference>();
private static ReferenceQueue<WorkViewModel> garbageCollectedObjectsQueue = new ReferenceQueue<WorkViewModel>();
private long _nativeHandle;
private WorkViewModelPhantomReference(WorkViewModel workViewModel, long nativeHandle)
{
super(workViewModel, garbageCollectedObjectsQueue);
_nativeHandle = nativeHandle;
}
public static void register(WorkViewModel workViewModel, long nativeHandle)
{
phantomReferences.add(new WorkViewModelPhantomReference(workViewModel, nativeHandle));
}
public static void deleteOrphanedNativePeerObjects()
{
WorkViewModelPhantomReference reference;
while((reference = (WorkViewModelPhantomReference)garbageCollectedObjectsQueue.poll()) != null)
{
WorkViewModel.delete(reference._nativeHandle);
phantomReferences.remove(reference);
}
}
}
私はすぐにこのアプローチが拡大縮小しないと信じています。しかし、私は、あなたが "*基本クラスを作成する方法を見つけられていないというあなたの2番目の問題を理解していません。オブジェクトを取ってネイティブの削除を適切に処理します*"。あなたは2つのクラスから成る実用的なソリューションを持っています。その仮説的な基底クラスがどのような問題を解決し、どのようにしたらよいでしょうか? – Holger
@Holgerご返信ありがとうございます。規模の問題を私に説明してください。それが私が仮定的な基底クラスで解決しようとしているものです。私は多くのそのようなオブジェクトを持っていて、それらのそれぞれについて、私は第2のファントムクラスを作成しました。ベースクラスでは、余分なクラスを作成する必要はなく、単純にタイプを定義するだけでよいということを解決したいと考えています。 –
作成したオブジェクトごとに新しいファントムクラスを作成するのを待ちますか?あるいは「それぞれの」とはどういう意味ですか? – Holger