kotlin aopプラグインaspectjxを使用してピットの道を踏む(ボタンの繰り返しクリックを防止する)
5327 ワード
前言
私の前編のブログAndroid処理ボタン重複クリックイベントでは、AOPカットプログラミング処理ボタンの重複クリック問題を紹介していましたが、最近はkotlinを勉強していて、kotlinに基づいてjavaを使っているので、kotlinにも1つ書きたいと思っていましたが、以下の踏み込みの道がありました.
使用方法:
1.Aspectjの導入プロジェクトルートディレクトリのbuild.gradleに依存 を追加 appまたは他のmoduleディレクトリのbuild.gradleに、次のコードを追加します.
特に注意:ルートディレクトリにインポートされたaspectjxバージョンは必ず2.0.4または2.0.2バージョンで、以前のバージョンではkotlinが書いたAspectファイルが認識されないため、特に注意してください.aspectjxのgithubアドレスは以下の通りです.
https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
また、最新版のkotlinプラグインを使用することをお勧めします.次に、現在の私のバージョン依存性を貼ります.
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、カスタム注釈を追加する
使用方法:
方式一:View.OnClickListenerインタフェースを実現し、実現方法に注記@AopOnclickを加える.例は以下の通りである.
@AopOnclick(2000):2000はカスタマイズされた時間です.つまり、2秒以内に繰り返しクリックできない設定です
@AopOnclickも使用できますが、デフォルトは1000、つまり1秒です
これでaop切面制御ボタンの繰り返しクリックが完了しました.
私の前編のブログAndroid処理ボタン重複クリックイベントでは、AOPカットプログラミング処理ボタンの重複クリック問題を紹介していましたが、最近はkotlinを勉強していて、kotlinに基づいてjavaを使っているので、kotlinにも1つ書きたいと思っていましたが、以下の踏み込みの道がありました.
使用方法:
1.Aspectjの導入
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
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切面制御ボタンの繰り返しクリックが完了しました.