Saya telah meningkatkan ke Android Studio 3.1 hari ini, yang tampaknya telah menambahkan beberapa pemeriksaan serat lagi. Salah satu pemeriksaan serat ini adalah untuk subscribe()
panggilan RxJava2 sekali pakai yang tidak disimpan dalam variabel. Misalnya, mendapatkan daftar semua pemain dari basis data Kamar saya:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
Menghasilkan blok kuning besar dan tooltip ini:
Hasil
subscribe
tidak digunakan
Apa praktik terbaik untuk panggilan Rx sekali pakai seperti ini? Haruskah saya tetap memegang Disposable
dan dispose()
menyelesaikannya? Atau haruskah saya @SuppressLint
terus bergerak?
Ini sepertinya hanya mempengaruhi RxJava2 ( io.reactivex
), RxJava ( rx
) tidak memiliki serat ini.
android
android-studio
rx-java2
lint
android-studio-3.1
Michael Dodd
sumber
sumber
Disposable
ruang lingkup anggota dan menelepondispose()
ketika single selesai, tetapi tampaknya sia-sia rumit. Saya tertarik untuk melihat apakah ada cara yang lebih baik untuk melakukan ini.Jawaban:
IDE tidak tahu apa efek potensial yang dapat dimiliki langganan Anda ketika tidak dibuang, sehingga memperlakukannya sebagai berpotensi tidak aman. Misalnya, Anda
Single
mungkin berisi panggilan jaringan, yang dapat menyebabkan kebocoran memori jika AndaActivity
ditinggalkan selama eksekusi.Cara mudah untuk mengelola sejumlah besar
Disposable
s adalah dengan menggunakan CompositeDisposable ; cukup buatCompositeDisposable
variabel instance baru di kelas terlampir Anda, lalu tambahkan semua Disposables Anda ke CompositeDisposable (dengan RxKotlin Anda bisa menambahkanaddTo(compositeDisposable)
semua Disposables Anda). Akhirnya, setelah selesai dengan instance Anda, teleponlahcompositeDisposable.dispose()
.Ini akan menghilangkan peringatan serat, dan memastikan Anda
Disposables
dikelola dengan benar.Dalam hal ini, kode tersebut akan terlihat seperti:
sumber
error: cannot find symbol method addTo(CompositeDisposable)
dengan "rxjava: 2.1.13". Dari mana metode ini berasal? (RxSwift atau RxKotlin saya kira)Saat Kegiatan akan dihancurkan, daftar Pakai akan dihapus dan kami baik-baik saja.
sumber
Anda dapat berlangganan dengan DisposableSingleObserver :
Jika Anda perlu langsung membuang
Single
objek (misalnya sebelum memancarkan), Anda dapat menerapkan metodeonSubscribe(Disposable d)
untuk mendapatkan dan menggunakanDisposable
referensi.Anda juga dapat mewujudkan
SingleObserver
antarmuka dengan Anda sendiri atau menggunakan kelas anak lainnya.sumber
Seperti yang disarankan Anda dapat menggunakan global
CompositeDisposable
untuk menambahkan hasil operasi berlangganan di sana.The RxJava2Extensions perpustakaan berisi metode yang berguna untuk secara otomatis hapus dibuat pakai dari
CompositeDisposable
saat itu selesai. Lihat bagian berlanggananAutoDispose .Dalam kasus Anda mungkin terlihat seperti ini
sumber
Anda dapat menggunakan Uber AutoDispose dan rxjava
.as
Pastikan Anda mengerti ketika Anda berhenti berlangganan berdasarkan ScopeProvider.
sumber
Berkali-kali saya menemukan diri saya kembali ke pertanyaan tentang cara membuang langganan dengan benar, dan khususnya pada posting ini. Beberapa blog dan ceramah mengklaim bahwa gagal menelepon
dispose
tentu menyebabkan kebocoran memori, yang menurut saya terlalu umum. Dalam pemahaman saya, peringatan serat tentang tidak menyimpan hasilsubscribe
adalah tidak menjadi masalah dalam beberapa kasus, karena:Karena saya tidak ingin menekan peringatan serat, saya baru-baru ini mulai menggunakan pola berikut untuk kasus dengan sinkron diamati:
Saya akan tertarik pada komentar tentang ini, terlepas dari apakah itu konfirmasi kebenaran atau ditemukannya celah.
sumber
Ada cara lain yang tersedia, yaitu menghindari menggunakan Disposables secara manual (menambah dan menghapus langganan).
Anda dapat mendefinisikan Observable dan yang dapat diamati akan menerima konten dari SubjectBehaviour (jika Anda menggunakan RxJava). Dan dengan meneruskan itu ke LiveData Anda , itu akan berhasil. Lihatlah contoh berikut berdasarkan pertanyaan awal:
sumber
Jika Anda yakin sekali pakai ditangani dengan benar, misalnya menggunakan operator doOnSubscribe (), Anda dapat menambahkan ini ke Gradle:
sumber
@SuppressLint("CheckResult")
hanya pada metode.