kotlin aopプラグインaspectjxを使用してピットの道を踏む(ボタンの繰り返しクリックを防止する)

5327 ワード

前言
私の前編のブログAndroid処理ボタン重複クリックイベントでは、AOPカットプログラミング処理ボタンの重複クリック問題を紹介していましたが、最近はkotlinを勉強していて、kotlinに基づいてjavaを使っているので、kotlinにも1つ書きたいと思っていましたが、以下の踏み込みの道がありました.
使用方法:
1.Aspectjの導入
  • プロジェクトルートディレクトリのbuild.gradleに依存
  • を追加
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
  • appまたは他のmoduleディレクトリのbuild.gradleに、次のコードを追加します.
  • apply plugin: 'com.hujiang.android-aspectjx'
    dependencies {
      
        implementation 'org.aspectj:aspectjrt:1.8.13'
    }
    注意:aspectjxがmoduleまたはlibraryに依存を導入している場合、appのbuild.gradleにも依存を追加する必要があります.moduleまたはlibraryのaop注釈を使用しても有効ではありません.(具体的な原因はまだ発見されていない)
    特に注意:ルートディレクトリにインポートされたaspectjxバージョンは必ず2.0.4または2.0.2バージョンで、以前のバージョンではkotlinが書いたAspectファイルが認識されないため、特に注意してください.aspectjxのgithubアドレスは以下の通りです.
    https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
    また、最新版のkotlinプラグインを使用することをお勧めします.次に、現在の私のバージョン依存性を貼ります.
    buildscript {
        ext.kotlin_version = '1.3.31'
        repositories {
            google()
            jcenter()
        }
        dependencies {
    //        classpath 'com.android.tools.build:gradle:3.0.1'
            classpath 'com.android.tools.build:gradle:3.2.1'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    現在の最新バージョンは1.3.31です.最新でない場合は、次のWebサイトを参照してください.
    http://www.kotlincn.net/docs/reference/using-gradle.html 中国語版
    https://kotlinlang.org/docs/reference/using-gradle.html 英語版
    コンパイル中にError:Failed to resolve:org.jetbrains.kotlin:kotlin-stdlib-jre 7:1.3.31エラーが発生した場合は、私のブログをクリックして確認し、解決策があります.
    エラーコードCould not find matching constructor for:org.gradle.util.Clock()が間違っている場合は、このブログに解決策があります.
    2、カスタム注釈を追加する
    /**
     * AnnotationRetention.SOURCE:         Class   。
     * AnnotationRetention.BINARY:        Class   ,       。
     * AnnotationRetention.RUNTIME:        Class   ,    。
     */
    @Retention(AnnotationRetention.RUNTIME)
    /**
     * AnnotationTarget.CLASS: ,     ,        。
     * AnnotationTarget.ANNOTATION_CLASS:     。
     * AnnotationTarget.TYPE_PARAMETER:Generic type parameter (unsupported yet)      (    )。
     * AnnotationTarget.PROPERTY:  。
     * AnnotationTarget.FIELD:  ,         。
     * AnnotationTarget.LOCAL_VARIABLE:    。
     * AnnotationTarget.VALUE_PARAMETER:           。
     * AnnotationTarget.CONSTRUCTOR:     (         )。
     * AnnotationTarget.FUNCTION:  (       )。
     * AnnotationTarget.PROPERTY_GETTER:      getter。
     * AnnotationTarget.PROPERTY_SETTER:      setter。
     * AnnotationTarget.TYPE:    。
     * AnnotationTarget.EXPRESSION:     。
     * AnnotationTarget.FILE:  。
     * AnnotationTarget.TYPEALIAS:@SinceKotlin("1.1")     ,Kotlin1.1   。
     */
    @Target(AnnotationTarget.FUNCTION)
    annotation class AopOnclick(
            /**
             *       
             */
            val value: Long = 1000)
    3、繰り返しクリック判定ツール類をパッケージする
    object AopClickUtil {
        /**
         *          
         */
        private var mLastClickTime: Long = 0
    
        /**
         *        
         *
         * @param intervalMillis      (  )
         * @return  true: ,false:  
         */
        fun isFastDoubleClick(intervalMillis: Long): Boolean {
            //        long time = System.currentTimeMillis();
            val time = SystemClock.elapsedRealtime()
            val timeInterval = Math.abs(time - mLastClickTime)
            return if (timeInterval < intervalMillis) {
                true
            } else {
                mLastClickTime = time
                false
            }
        }
    }
    4、Aspect AOP処理類の作成
    @Aspect
    class AopClickAspect {
    
        /**
         *     ,        @AopOnclick     
         *   :  com.freak.kotlinhttpmanager.aop.AopOnclick     
         *       AopOnclick       
         */
        @Pointcut("execution(@com.freak.kotlinhttpmanager.aop.AopOnclick * *(..))")
        fun methodAnnotated() {
        }
    
        /**
         *         ,      
         */
        @Around("methodAnnotated()")
        @Throws(Throwable::class)
        fun aroundJoinPoint(joinPoint: ProceedingJoinPoint) {
            //        
            val methodSignature = joinPoint.signature as MethodSignature
            val method = methodSignature.method
            if (!method.isAnnotationPresent(AopOnclick::class.java)) {
                return
            }
            val aopOnclick = method.getAnnotation(AopOnclick::class.java)
            //         
            if (!AopClickUtil.isFastDoubleClick(aopOnclick.value)) {
                //       ,     
                joinPoint.proceed()
            }
        }
    }
     
    使用方法:
    方式一:View.OnClickListenerインタフェースを実現し、実現方法に注記@AopOnclickを加える.例は以下の通りである.
    @AopOnclick
    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.aop -> {
                LogUtil.e("  ")
            }
        }
    }
    方式2:イベント設定を直接クリック
    aop.setOnClickListener {
        aop()
    }
    @AopOnclick(2000)
    fun aop() {
        text2.text = "aop         :${saopSum++} "
    }
    kotlinはjavaと同じように実装方法がないので、メソッドをカスタマイズして、メソッドに注釈を加えることができます.
    @AopOnclick(2000):2000はカスタマイズされた時間です.つまり、2秒以内に繰り返しクリックできない設定です
    @AopOnclickも使用できますが、デフォルトは1000、つまり1秒です
    これでaop切面制御ボタンの繰り返しクリックが完了しました.