java实现debounce_开发中使用throttle和debounce

本文探讨了在WEB、Android和iOS开发中如何使用throttle和debounce技术来提升用户体验,尤其是在按钮点击和搜索接口调用的场景。通过Java和RxJava的示例,展示了如何在Android应用中实现debounce,以及在Swift中使用类似方法。同时提到了RxSwift的优势,它在不同平台上的通用性。
摘要由CSDN通过智能技术生成

前言

不管是WEB还是Android或者是iOS开发中 我们都会有这样的问题

按钮点击时 连续点击只让第一次生效

搜索时文本不断变化导致调用多次接口

上面的两个问题解决后能大大提升用户体验 解决它们就用到了throttle和debounce

WEB(JS)

Android(Java)

主要用到RxJava和RxAndroid

iOS(OC/Swift)

如果项目中已经用到 或者想用RxSwift的话就选择第二种方式

如果项目不想引用太多东西 或者项目用的OC 就选择第一种方式

ReactiveCocoa vs RxSwift?

RxSwift虽然只支持iOS8之后的系统 但是现在基本只需适配iOS8以后了 所以不用担忧

RxSwift和RxJava以及RxJS 语法基本都相似 这真的就是learn once, apply everywhere.

所以推荐使用RxSwift

MessageThrottle实例

在OC中使用

- (void)viewDidLoad {

[super viewDidLoad];

MTRule *rule = [[MTRule alloc] initWithTarget:self selector:@selector(buttonClick:) durationThreshold:5];

rule.messageQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//rule.mode = MTPerformModeFirstly;

//rule.mode = MTPerformModeLast;

rule.mode = MTPerformModeDebounce;

[MTEngine.defaultEngine applyRule:rule];

}

- (IBAction)buttonClick:(UIButton *)sender {

dispatch_async(dispatch_get_main_queue(), ^{

self.label.text = [NSString stringWithFormat:@"点击生效的时间: %@", [self getDateTimeStr]];

});

}

- (NSString *)getDateTimeStr{

NSDate *date = [NSDate new];

NSDateFormatter *df = [NSDateFormatter new];

[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

df.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone localTimeZone].secondsFromGMT];

NSString *localDateString = [df stringFromDate:date];

return localDateString;

}

如上例子中 设置的间隔为5秒 可设置的模式有三种

rule.mode = MTPerformModeFirstly;

rule.mode = MTPerformModeLast;

rule.mode = MTPerformModeDebounce;

MTPerformModeFirstly 如果连续点击按钮 每5s的第一次生效

MTPerformModeLast 如果连续点击按钮 每5s的最后一次生效

MTPerformModeDebounce 如果连续点击按钮 则重置计时器 停止点击后5s操作生效

在Swift中使用

self.usernameTextField.addTarget(self, action: #selector(updatePicImageView), for: UIControlEvents.editingChanged)

let rule = MTRule.init(target: self, selector: #selector(updatePicImageView), durationThreshold: 1.2);

rule.messageQueue = DispatchQueue.main;

rule.mode = .debounce;

MTEngine.default.apply(rule);

这个和下面用RxSwift的示例做了同样的事 可以对比一下

RxSwift实例

根据用户输入的名字变化 更新头像

_ = self.usernameTextField.rx.text.orEmpty

.debounce(1.2, scheduler: MainScheduler.instance)

.distinctUntilChanged()

.observeOn(MainScheduler.instance)

.subscribe(onNext: { (query) in

self.updatePicImageView();

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值