के साथ मूल सहकर्मी को हटाएं Google I/O '17 बातचीत में हंस बोहेम के रूप में "How to Manage Native C++ Memory in Android" सुझाव देता है कि मैं PhantomReference
कक्षा का उपयोग करता हूं ताकि देशी सहकर्मियों को ठीक से हटा दिया जा सके।सामान्य फ़ैंटॉम रिफरेंस क्लास
18 min 57 sec पर लिंक किए गए वीडियो में वह किसी ऑब्जेक्ट का उदाहरण कार्यान्वयन दिखाता है जो PhantomReference
कक्षा में इसके प्रकार के लिए पंजीकृत है। यह PhantomReference
वर्ग, वह 19 min 49 sec पर दिखाता है। तो मैंने अपने उदाहरण वस्तु के लिए अपना दृष्टिकोण कॉपी किया। निचे देखो।
हालांकि यह दृष्टिकोण ठीक काम करता है, यह स्केल नहीं करता है। मुझे कुछ मात्रा में ऑब्जेक्ट्स बनाने की आवश्यकता होगी और मुझे बेस क्लास बनाने के लिए कोई रास्ता नहीं मिला है (या तो मेरी ऑब्जेक्ट्स या 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);
}
}
}
मुझे विश्वास है कि यह दृष्टिकोण पैमाने पर नहीं है। लेकिन मैं आपके दूसरे मुद्दे को समझ नहीं पा रहा हूं कि आपको "बेस क्लास बनाने का कोई तरीका नहीं मिला है ... जो किसी भी वस्तु को ले जाएगा और देशी हटाने को ठीक से संभालेगा *"। आपके पास दो वर्गों का एक समाधान समाधान है। उस समस्या को किस समस्या को हल करना चाहिए और कैसे? – Holger
@ होल्गर आपके उत्तर के लिए धन्यवाद। कृपया मुझे स्केल मुद्दा समझाओ? यही वह है जो मैं एक काल्पनिक आधार वर्ग के साथ हल करने की कोशिश करता हूं। मेरे पास ऐसी कई वस्तुएं हैं और उनमें से प्रत्येक के लिए मुझे दूसरी प्रेत कक्षा बनाना है। बेस क्लास के साथ मैं यह हल करना चाहता हूं कि मुझे अतिरिक्त कक्षा बनाने की आवश्यकता नहीं होगी या इसे इतना आसान बनाना होगा कि मुझे केवल प्रकार को परिभाषित करने की आवश्यकता है। –
रुको- आप अपनी प्रत्येक वस्तु के लिए एक नया प्रेत वर्ग बनाते हैं? या "उनमें से प्रत्येक" के साथ आपका क्या मतलब है? – Holger