如Google I/O '17演讲“如何在Android中管理本机C++内存”中的Hans Boehm建议,我使用
在18分57秒的链接视频中,他展示了一个对象将自身注册到其类型的
我该如何创建一个通用的基础
我尝试转换通用的
我的
PhantomReference
类确保本机对等体被正确删除。在18分57秒的链接视频中,他展示了一个对象将自身注册到其类型的
PhantomReference
类的示例实现。他在19分49秒展示了这个PhantomReference
类。因此,我复制了他的方法来处理我的示例对象。请参见下文。
虽然这种方法很好用,但不可扩展。我需要创建相当数量的对象,但我还没有找到一种方法来创建基类(无论是针对我的对象还是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);
}
}
}
delete
方法的不同类创建一个新的类,对吗?并且你需要为每个需要清理的对象创建另一个新的虚拟对象。当我第一次读到“不可扩展”时,我以为你在谈论这种设计的性能差,这部分与你必须创建的对象有关,然而,似乎你主要是在谈论代码复杂性,这与类有关。后者可能是可以解决的。 - Holger