Saya memiliki Handler dari sub-Aktivitas saya yang dipanggil oleh Activity utama . Handler ini digunakan oleh sub-kelas ke postDelay
beberapa Runnables, dan saya tidak bisa mengelolanya. Sekarang, dalam onStop
acara tersebut, saya harus menghapusnya sebelum menyelesaikan Kegiatan (entah bagaimana saya menelepon finish()
, tetapi masih memanggil lagi dan lagi). Apakah ada cara untuk menghapus semua callback dari Handler?
java
android
callback
android-handler
Luke Vo
sumber
sumber
removeCallbacksAndMessages(null)
tidak akan menghapus beberapa panggilan balik saya. Ketika saya ingin berhenti menerima Callback, saya akan meneleponhandler.removeCallbacksAndMessages(null)
dan mengatur handler saya ke nol, tetapi karena saya masih akan mendapatkan callback, saya akan menemui NPE ketika saya ingin mengulanginyahandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
adalah yang paling dapat diandalkan. Masih menggunakannya hari ini.Untuk setiap
Runnable
contoh spesifik , hubungiHandler.removeCallbacks()
. Perhatikan bahwa ia menggunakanRunnable
instance itu sendiri untuk menentukan callback mana yang dibatalkan pendaftarannya, jadi jika Anda membuat instance baru setiap kali posting dibuat, Anda perlu memastikan bahwa Anda memiliki referensi untuk membalas tepatRunnable
. Contoh:Anda dapat menelepon
myHandler.postDelayed(myRunnable, x)
untuk mengirim panggilan balik lain ke antrian pesan di tempat lain dalam kode Anda, dan menghapus semua panggilan balik yang tertunda denganmyHandler.removeCallbacks(myRunnable)
Sayangnya, Anda tidak bisa begitu saja "menghapus" keseluruhan
MessageQueue
untukHandler
, bahkan jika Anda membuat permintaan untukMessageQueue
objek yang terkait dengannya karena metode untuk menambah dan menghapus item dilindungi paket (hanya kelas dalam paket android.os yang dapat memanggilnya). Anda mungkin harus membuatHandler
subclass tipis untuk mengelola daftarRunnable
ketika mereka diposkan / dieksekusi ... atau melihat paradigma lain untuk meneruskan pesan Anda di antara masing-masingActivity
Semoga Itu Membantu!
sumber
Jika Anda tidak memiliki referensi Runnable, pada panggilan balik pertama, dapatkan keberatan dari pesan tersebut, dan gunakan removeCallbacksAndMessages () untuk menghapus semua panggilan balik terkait.
sumber
Tetapkan handler baru dan runnable:
Pos panggilan tertunda:
Hapus panggilan balik Anda dari penangan Anda:
sumber
Harap dicatat bahwa seseorang harus mendefinisikan ruang lingkup a
Handler
dan aRunnable
di kelas, sehingga itu dibuat sekali.removeCallbacks(Runnable)
berfungsi dengan benar kecuali seseorang mendefinisikannya beberapa kali. Silakan lihat contoh-contoh berikut untuk pemahaman yang lebih baik:Cara yang salah:
Jika Anda memanggil
onClick(..)
metode, Anda tidak pernah berhentidoIt()
memanggil metode sebelum memanggilnya. Karena setiap waktu menciptakannew Handler
dan memberinew Runnable
contoh. Dengan cara ini, Anda kehilangan referensi yang diperlukan milik instance handler dan runnable .Jalan yang benar :
Dengan cara ini, Anda tidak kehilangan referensi aktual dan
removeCallbacks(runnable)
bekerja dengan sukses.Kalimat utama adalah 'mendefinisikannya sebagai global dalam Anda
Activity
atauFragment
apa yang Anda gunakan' .sumber
Seperti yang
josh527
dikatakan,handler.removeCallbacksAndMessages(null);
bisa bekerja.Tapi kenapa?
Jika Anda melihat kode sumbernya, Anda dapat memahaminya dengan lebih jelas. Ada 3 jenis metode untuk menghapus panggilan balik / pesan dari penangan (MessageQueue):
Handler.java (tinggalkan beberapa metode kelebihan)
MessageQueue.java melakukan pekerjaan nyata:
sumber