Saya telah menjadi pengembang java selama 2 tahun.
Tapi saya belum pernah menulis Referensi Lemah dalam kode saya. Bagaimana cara menggunakan WeakReference untuk membuat aplikasi saya lebih efisien terutama aplikasi Android?
java
android
weak-references
Chris
sumber
sumber
Jawaban:
Menggunakan
WeakReference
di Android tidak ada bedanya dengan menggunakannya di Jawa kuno. Berikut ini adalah panduan hebat yang memberikan penjelasan terperinci: Memahami Referensi Lemah .Anda harus berpikir tentang menggunakan satu setiap kali Anda memerlukan referensi ke suatu objek, tetapi Anda tidak ingin referensi itu untuk melindungi objek dari pengumpul sampah. Contoh klasik adalah cache yang Anda inginkan menjadi sampah yang dikumpulkan ketika penggunaan memori terlalu tinggi (sering diimplementasikan dengan
WeakHashMap
).Pastikan untuk memeriksa
SoftReference
danPhantomReference
juga.EDIT: Tom telah menimbulkan beberapa kekhawatiran tentang penerapan cache
WeakHashMap
. Berikut ini adalah artikel yang menjelaskan masalahnya: WeakHashMap bukan cache!Tom benar bahwa ada keluhan tentang kinerja Netbeans yang buruk karena
WeakHashMap
caching.Saya masih berpikir itu akan menjadi pengalaman belajar yang baik untuk mengimplementasikan cache
WeakHashMap
dan kemudian membandingkannya dengan cache linting tangan Anda yang diimplementasikanSoftReference
. Di dunia nyata, Anda mungkin tidak akan menggunakan salah satu dari solusi ini, karena lebih masuk akal untuk menggunakan perpustakaan pihak ke-3 seperti Apache JCS .sumber
WeakHashMap
digunakan sebagai cache fatal. Entri dapat dihapus segera setelah dibuat. Ini mungkin tidak akan terjadi ketika Anda menguji, tetapi mungkin baik saat digunakan. Sebagai catatan, NetBeans dapat dibawa ke CPU 100% yang efektif dengan ini.WeakHashMap
bahkan jika Anda benar bahwa itu adalah pilihan yang buruk;)[EDIT2] Saya menemukan contoh bagus lain dari
WeakReference
. Memproses Bitmap Dari halaman Thread UI dalam Menampilkan Bitmap Panduan pelatihan yang efisien , menunjukkan satu penggunaanWeakReference
dalam AsyncTask.Ia mengatakan,
Selamat coding!
[EDIT] Saya menemukan contoh yang sangat bagus
WeakReference
dari facebook-android-SDK . Kelas ToolTipPopup tidak lain adalah kelas widget sederhana yang menunjukkan tooltip di atas tampilan jangkar. Saya menangkap tangkapan layar.Kelasnya sangat sederhana (sekitar 200 baris) dan layak untuk dilihat. Di kelas itu,
WeakReference
kelas digunakan untuk memegang referensi ke tampilan jangkar, yang masuk akal, karena memungkinkan untuk tampilan jangkar menjadi sampah yang dikumpulkan bahkan ketika instance tooltip hidup lebih lama daripada tampilan jangkar.Selamat coding! :)
Izinkan saya membagikan satu contoh kerja
WeakReference
kelas. Ini sedikit cuplikan kode dari widget kerangka Android yang disebutAutoCompleteTextView
.Singkatnya,
WeakReference
kelas digunakan untuk memegangView
objek untuk mencegah kebocoran memori dalam contoh ini.Saya hanya akan menyalin dan menempelkan kelas PopupDataSetObserver, yang merupakan kelas bersarang
AutoCompleteTextView
. Ini sangat sederhana dan komentarnya menjelaskan kelas dengan baik. Selamat coding! :)Dan
PopupDataSetObserver
digunakan dalam pengaturan adaptor.Satu hal terakhir. Saya juga ingin tahu contoh kerja
WeakReference
dalam aplikasi Android, dan saya bisa menemukan beberapa sampel dalam aplikasi sampel resminya. Tetapi saya benar-benar tidak dapat memahami penggunaan beberapa dari mereka. Sebagai contoh, aplikasi ThreadSample dan DisplayingBitmaps digunakanWeakReference
dalam kodenya, tetapi setelah menjalankan beberapa tes, saya menemukan bahwa metode get () tidak pernah kembalinull
, karena objek tampilan yang direferensikan didaur ulang dalam adaptor, bukan sampah yang dikumpulkan.sumber
Beberapa jawaban lain tampaknya tidak lengkap atau terlalu panjang. Inilah jawaban umum.
Cara menggunakan WeakReference di Java dan Android
Anda dapat melakukan langkah-langkah berikut:
WeakReference
variabelKode
MyClass
memiliki referensi yang lemah untukAnotherClass
.AnotherClass
memiliki referensi yang kuat untukMyClass
.Catatan
MyClass
adalah A danAnotherClass
B.WeakReference
adalah memiliki kelas lain mengimplementasikan antarmuka. Ini dilakukan dalam Pola Pendengar / Pengamat .Contoh praktis
sumber
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
objek itu sendiridoSomething
agar tidak berfungsinull
sebelum memanggilget
fungsi.Pemetaan "dikanonik" adalah di mana Anda menyimpan satu instance objek yang bersangkutan dalam memori dan semua yang lain mencari contoh tertentu melalui pointer atau mekanisme semacam itu. Di sinilah referensi lemah dapat membantu. Jawaban singkatnya adalah bahwa objek WeakReference dapat digunakan untuk membuat pointer ke objek di sistem Anda sambil tetap membiarkan objek-objek tersebut untuk direklamasi oleh pengumpul sampah begitu mereka keluar dari ruang lingkup. Sebagai contoh jika saya memiliki kode seperti ini:
Objek apa pun yang saya daftarkan tidak akan pernah direklamasi oleh GC karena ada referensi untuk itu disimpan dalam set
registeredObjects
. Di sisi lain jika saya melakukan ini:Kemudian ketika GC ingin mengklaim kembali objek dalam Set itu akan dapat melakukannya. Anda dapat menggunakan teknik ini untuk caching, katalog, dll. Lihat di bawah untuk referensi untuk diskusi yang lebih mendalam tentang GC dan caching.
Ref: Pengumpul sampah dan Referensi Lemah
sumber