1. object ViewThrottleBindingAdapter {
    2. @BindingAdapter("android:onClickListener")
    3. @JvmStatic fun setViewOnClickListener(view: View, callback: View.OnClickListener) {
    4. view.setOnClickListener(ThrottleOnClickListener(callback))
    5. }
    6. @BindingAdapter("android:onClick")
    7. @JvmStatic fun setViewOnClick(view: View, callback: View.OnClickListener) {
    8. view.setOnClickListener(ThrottleOnClickListener(callback))
    9. }
    10. /** 原始OnClickListener的包装 */
    11. class ThrottleOnClickListener(
    12. private val callback: View.OnClickListener
    13. ) : View.OnClickListener {
    14. // 上次点击时间
    15. private var mLastTime = 0L
    16. override fun onClick(v: View?) {
    17. val currentTime = System.currentTimeMillis()
    18. if (currentTime - mLastTime >= CLICK_THRESHOLD) {
    19. mLastTime = currentTime
    20. // 调用点击方法
    21. callback.onClick(v)
    22. } else {
    23. Logger.d(TAG_APP, "[ThrottleOnClickListener] [onClick] throttle")
    24. }
    25. }
    26. companion object {
    27. // 1秒之类的点击过滤掉
    28. private const val CLICK_THRESHOLD = 1000
    29. }
    30. }
    31. }

    ASM 字节码插桩统一处理

    1. //插桩前
    2. view.setOnClickListener(object : View.OnClickListener {
    3. override fun onClick(view: View) {
    4. //TODO
    5. }
    6. })
    7. //插桩后
    8. view.setOnClickListener(object : View.OnClickListener {
    9. override fun onClick(view: View) {
    10. if (!ViewDoubleClickCheck.canClick(view)){
    11. return
    12. }
    13. //TODO
    14. }
    15. })