好的,另一个解决方案可能只是扩展现有的 Handler 类(Kotlin):
class MarkingHandler: Handler() {
private val markedCallbacks = ConcurrentHashMap<Int, Runnable>()
fun postMarkedDelayed(markId: Int, delayMIllis: Long, callback: () -> Unit) {
if(hasMarkedCallback(markId))
throw IllegalArgumentException("The markId id is already exist in the handler")
markedCallbacks[markId] = Runnable {
markedCallbacks.remove(markId)
callback()
}
postDelayed(markedCallbacks[markId], delayMIllis)
}
fun removeMarkedCallback(markId: Int) {
if(hasMarkedCallback(markId)) {
removeCallbacks(markedCallbacks[markId])
markedCallbacks.remove(markId)
}
}
fun hasMarkedCallback(markId: Int) = markedCallbacks.contains(markId)
fun hasMarkedCallbacks() = markedCallbacks.size > 0
}
用法:
val handler_Alerts = MarkingHandler()
handler_Alerts.postMarkedDelayed(1, 1000) runnable@{
Toast.makeText(getApplicationContext(), "In Handler", Toast.LENGTH_SHORT).show()
handler_Alerts.postMarkedDelayed(1, 1000, return@runnable)
}
if(handler_Alerts.hasMarkedCallback(1) /*|| handler_Alerts.hasMarkedCallbacks()*/) {
handler_Alerts.removeMarkedCallback(1)
}
类似的方法也可以用于在类中包装post(delayMIllis: Long)
方法MarkingHandler