正如 Hans Boehm 在 Google I/O '17 演讲“如何在 Android 中管理本机 C++ 内存”中建议我使用PhantomReference
该类来确保正确删除本机对等点。
在18 分 57 秒的链接视频中,他展示了一个对象的示例实现,该对象将自身注册到PhantomReference
该类的类型中。这PhantomReference
堂课,他在19 分 49 秒时显示。所以我为我的示例对象复制了他的方法。见下文。
虽然这种方法效果很好,但它不能扩展。我将需要创建相当多的对象,但我还没有找到一种方法来创建一个基类(对于我的对象或PhantomReference
基类),它可以接受任何对象并正确处理本机删除。
如何创建一个PhantomReference
可以在提供的对象上调用本机静态方法的通用基类?
我试图转换PhantomReference
泛型,但本机静态删除方法阻碍了实现。
我的WorkViewModel
import android.databinding.*;
public class WorkViewModel extends BaseObservable
{
private long _nativeHandle;
public WorkViewModel(Database database, int workId)
{
_nativeHandle = create(database.getNativeHandle(), workId);
WorkViewModelPhantomReference.register(this, _nativeHandle);
}
private static native long create(long databaseHandle, int workId);
static native void delete(long nativeHandle);
@Bindable
public native int getWorkId();
public native void setWorkId(int workId);
}
我的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);
}
}
}