集成方法
支持aspectj和jitpack杆逗,在工程的grade添加
...
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
}
...
//Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在使用的module的grade中添加依賴(lài)和注解處理器墓拜,以及支持aspectj
...
apply plugin: 'android-aspectjx'
...
implementation 'com.github.tyhjh.Annotation:annotationlibrary:v1.1.8'
annotationProcessor 'com.github.tyhjh.Annotation:annotator:v1.1.8'
需要支持lambda 表達(dá)式渠驼,在模塊的build.gradle的android節(jié)點(diǎn)下面添加支持
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
使用方法
控件的依賴(lài)注入
初始化
需要使用注解的類(lèi)中需要初始化
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注冊(cè)疫鹊,進(jìn)行控件的初始化
CatAnnotation.injectView(this);
@ViewById
該注解用于控件的初始化杉武,可以傳入控件的ID儡陨,當(dāng)控件的ID和變量名一致是可以不傳入
//變量名和控件ID值一樣
@ViewById
TextView tvLogin,tvName;
被注解的變量名可以和控件ID值不一樣褪子,但是需要手動(dòng)設(shè)置控件ID值,這種方法只能在app
模塊使用
//手動(dòng)設(shè)置id
@ViewById(R.id.et_pwd)
EditText etPwd;
@Click
該注解為設(shè)置控件的點(diǎn)擊事件骗村,同樣可以傳入控件ID嫌褪,改方法不需要初始化控件,可以直接使用
@Click
void tvLogin() {
// TODO call server...
}
@Click
void tvLogin(R.id.tvLogin) {
// TODO call server...
}
點(diǎn)擊防抖動(dòng)
新增防抖動(dòng)功能胚股,使用了@Click
注解的按鈕默認(rèn)在300ms內(nèi)只能點(diǎn)擊一次笼痛,可以通過(guò)設(shè)置全局修改,也可以修改單個(gè)點(diǎn)擊事件的間隔
//全局修改點(diǎn)擊間隔琅拌,需要盡早設(shè)置
AvoidShake.setClickIntervalTime(1000);
//單個(gè)設(shè)置點(diǎn)擊間隔
@Click(interval = 100)
void txtView() {
...
}
//不使用注解的控件設(shè)置點(diǎn)擊間隔
txtView.setOnClickListener(new AvoidShakeClickHelper(500, new AvoidShakeListener() {
@Override
public void onClick(View v) {
//todo
}
}));
@Background
該注解為方法切換到子線程運(yùn)行缨伊,可以進(jìn)行延遲執(zhí)行,方法不能有返回值进宝,否則不生效刻坊,delay
值默認(rèn)為0
@Background(delay = 1000)
void backgroud() {
Log.e("backgroud", Thread.currentThread().getName() + ":" + System.currentTimeMillis());
}
@UiThread
該注解為方法切換到主線程運(yùn)行,可以進(jìn)行延遲執(zhí)行党晋,方法不能有返回值谭胚,否則不生效徐块,delay
值默認(rèn)為0
@UiThread(delay = 1000 * 5)
void toast(String msg) {
Log.e("UiThread", Thread.currentThread().getName() + ":" + System.currentTimeMillis());
}
@RecyclerMore
該注解為RecyclerView滑動(dòng)到底部監(jiān)聽(tīng),可以實(shí)現(xiàn)下拉加載更多的功能灾而,使用很方便胡控,變量名就是方法名,也可以手動(dòng)設(shè)置控件ID值旁趟;可以設(shè)置pageSize
的值昼激,如果當(dāng)前加載的item數(shù)量小于pageSize
那么就不會(huì)觸發(fā)方法,默認(rèn)滑動(dòng)到底部監(jiān)聽(tīng)就會(huì)觸發(fā)方法
@RecyclerMore(pageSize = 5)
void ryclView() {
mList.addAll(mList2);
mAdapter.notifyDataSetChanged();
}
@CheckBoxChange
該注解為CheckBox的OnCheckedChange監(jiān)聽(tīng)方法锡搜,被注解的方法需要有下面兩個(gè)參數(shù)
@CheckBoxChange
void swTest(boolean isChecked, CompoundButton swTest) {
Toast.makeText(this, "isChecked:" + swTest.isChecked(), Toast.LENGTH_SHORT).show();
}
@ExecuteTime
該注解為獲取被注解的方法執(zhí)行的時(shí)間
//對(duì)方法進(jìn)行注解
@ExecuteTime
private void etTest() {
Toast.makeText(MainActivity.this, "哈哈哈", Toast.LENGTH_SHORT).show();
}
//全局注冊(cè)時(shí)間監(jiān)聽(tīng)
ExecuteManager.getInstance().setPrinter((executeTime, annotion, methodInfo) -> {
Log.i(TAG,"方法耗時(shí)為: "+executeTime);
Log.i(TAG,"方法的詳情:"+methodInfo.toString());
});
@CustomAnnotation
該注解為自定義注解癣猾,用于監(jiān)聽(tīng)方法執(zhí)行使用,可以用于數(shù)據(jù)埋點(diǎn)啥的余爆;
//對(duì)方法進(jìn)行注解
@CustomAnnotation
private void etTest() {
Toast.makeText(MainActivity.this, "哈哈哈", Toast.LENGTH_SHORT).show();
}
//對(duì)方法執(zhí)行進(jìn)行監(jiān)聽(tīng)
ExecuteManager.getInstance().addExecuteListener(new IExecuteListener() {
@Override
public void before(CustomAnnotation annotation, MethodInfo methodInfo) {
//一個(gè)方法準(zhǔn)備開(kāi)始執(zhí)行
Log.i(TAG,"before MethodInfo is "+methodInfo.toString());
}
@Override
public void after(CustomAnnotation annotation, MethodInfo methodInfo) {
//一個(gè)方法執(zhí)行完成
Log.i(TAG,"after MethodInfo is "+methodInfo.toString());
}
});
相關(guān)推薦文章
- 使用注解實(shí)現(xiàn)Android線程切換:http://www.reibang.com/p/89d7b88eb76c
- Android編譯時(shí)注解:http://www.reibang.com/p/3052fa51ee95
- Android中注解的使用:http://www.reibang.com/p/de13b00042d6