為防止用戶在數(shù)據(jù)加載的時候接連點擊按鈕造成數(shù)據(jù)混亂哲银,我們可以用RxJava的形式實現(xiàn)按鈕的點擊事件,使用戶在你規(guī)定的時間內(nèi)再次點擊按鈕無效亩冬。
實現(xiàn)
1.首先引入RxJava2
implementation "io.reactivex.rxjava2:rxjava:2.1.17"
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
2.創(chuàng)建一個接口洪己,里面設置一個方法用于點擊事件時觸發(fā)
public interface MyClickListener {
void onClick(View view);
}
3.封裝一個proxyOnClickListener()方法,此方法用于代替之前的點擊事件方法
public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener)
//seconds:表示點擊按鈕的時間間隔贝攒,在此間隔內(nèi)點擊按鈕會使點擊無效
//view:傳進來的控件
//myClickListener:我們自己構(gòu)建的接口,需實現(xiàn)其中的onClick(View view)方法时甚,表示點擊時觸發(fā)的事件
4.創(chuàng)建ObserveOnSubscribe對象隘弊,此對象是Obsarveble創(chuàng)建時需要傳入的對象
ObservableOnSubscribe<View> subscribe = new ObservableOnSubscribe<View>() {
@Override
public void subscribe(final ObservableEmitter<View> emitter) throws Exception {
view.setOnClickListener(new View.OnClickListener() {//view是我們傳進來的view參數(shù)
@Override
public void onClick(View v) {
emitter.onNext(view);//將view發(fā)送給觀察者,在觀察者中實現(xiàn)我們接口中的onClick()方法
}
});
}
};
5.創(chuàng)建觀察者Observer
Observer<View> observer = new Observer<View>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(View view) {
myClickListener.onClick(view);//view是被觀察者傳過來的view荒适,在這里調(diào)用接口中的方法
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
6.觀察
Observable
.create(subscribe)//這是我們創(chuàng)建的ObserveOnSubscribe對象
.throttleFirst(seconds,TimeUnit.SECONDS)//這句很關(guān)鍵梨熙,這是RxJava中的操作符,在規(guī)定時間內(nèi)觀察者不在接收被觀察者發(fā)送的事件
.subscribe(observer);
7.完整的proxyOnClickListener方法
public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener){
ObservableOnSubscribe<View> subscribe = new ObservableOnSubscribe<View>() {
@Override
public void subscribe(final ObservableEmitter<View> emitter) throws Exception {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
emitter.onNext(view);
}
});
}
};
Observer<View> observer = new Observer<View>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(View view) {
myClickListener.onClick(view);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
Observable
.create(subscribe)
.throttleFirst(seconds,TimeUnit.SECONDS)
.subscribe(observer);
}
8.調(diào)用
proxyOnClickListener(2, button, new MyClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "onClick: ");
}
});
當我們點擊按鈕時會發(fā)現(xiàn)刀诬,在你第一次點擊按鈕的2秒內(nèi)再次點擊按鈕咽扇,并不會打印log日志,說明我們的點擊事件是無效的(其實OnClickListener中的onClick()方法是調(diào)用了陕壹,不過在其中 emitter.onNext(view)發(fā)送的view并未被觀察者接收)
源碼
源碼