android 二次点击退出,android-单击两次后退按钮以退出rxjava的活动

本文介绍了一种使用RxJava处理Android应用程序中双击返回按钮退出的实现方式。通过创建一个PublishSubject,结合RxJava的debounce、interval和timeInterval等操作符,确保用户在2秒内连续两次按下返回键时才退出应用。在onResume时订阅事件并在onPause时清理,确保正确响应用户的操作。
摘要由CSDN通过智能技术生成

寻找一种微妙的rx方法来退出活动,同时按两次返回按钮.

boolean doubleBackToExitPressedOnce = false;

@Override

public void onBackPressed() {

if (doubleBackToExitPressedOnce) {

super.onBackPressed();

return;

}

this.doubleBackToExitPressedOnce = true;

Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

doubleBackToExitPressedOnce=false;

}

}, 2000);

}

解决方法:

我建议稍微不同的方法.实际上,我们正在寻找的是两次点击之间的时间. RxJava的运算符interval(TimeUnit),可以为我们提供所需的确切信息.

因此,我们有了主题和所需的退出超时.

private static final long EXIT_TIMEOUT = 2000;

private CompositeDisposable compositeDisposable = new CompositeDisposable();

private PublishSubject backButtonClickSource = PublishSubject.create();

在onResume中,我们将运算符添加到主题中并进行订阅.我们将结果添加到CompositeDisposable中,以便以后可以将其与您活动中可能拥有的所有其他订阅一起处置.

@Override

protected void onResume() {

super.onResume();

compositeDisposable.add(backButtonClickSource

.debounce(100, TimeUnit.MILLISECONDS)

.observeOn(AndroidSchedulers.mainThread())

.doOnNext(new Consumer() {

@Override

public void accept(@NonNull Boolean event) throws Exception {

Toast.makeText(MainActivity.this, "Please press back once more to exit", Toast.LENGTH_SHORT).show();

}

})

.timeInterval(TimeUnit.MILLISECONDS)

.skip(1)

.filter(new Predicate>() {

@Override

public boolean test(@NonNull Timed interval) throws Exception {

return interval.time() < EXIT_TIMEOUT;

}

})

.subscribe(new Consumer>() {

@Override

public void accept(@NonNull Timed interval) throws Exception {

finish();

}

}));

}

我们使用去抖来消除噪音(可能是不必要的).然后,在每次单击时,我们都会向用户显示消息(无论您想要什么,为简单起见,我都使用Toast).在我们切换到主线程之前,否则将引发异常.我们跳过了第一个事件,因为否则会发出订阅和首次点击之间的时间间隔,如果时间间隔太小,则只需单击一次便会退出.所有大于我们的EXIT_TIMEOUT的间隔都将被过滤掉.最后,当我们获得足够小的时间间隔(不是第一次)时,我们就完成了活动.

然后,在onPause中,我们应该清除CompositeDisposable以便不再获得点击事件.

@Override

protected void onPause() {

super.onPause();

compositeDisposable.clear();

}

当然,在onBackPressed()中,我们应该将后退按钮单击转发到PublishSubject.

@Override

public void onBackPressed() {

backButtonClickSource.onNext(true);

}

标签:rx-android,onbackpressed,android

来源: https://codeday.me/bug/20191026/1934439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值