ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-26 06:25:21  阅读:352  来源: 互联网

标签:rx-android onbackpressed android


寻找一种微妙的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<Boolean> backButtonClickSource = PublishSubject.create();

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

@Override
protected void onResume() {
    super.onResume();

    compositeDisposable.add(backButtonClickSource
            .debounce(100, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(new Consumer<Boolean>() {
                @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<Timed<Boolean>>() {
                @Override
                public boolean test(@NonNull Timed<Boolean> interval) throws Exception {
                    return interval.time() < EXIT_TIMEOUT;
                }
            })
            .subscribe(new Consumer<Timed<Boolean>>() {
                @Override
                public void accept(@NonNull Timed<Boolean> 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有