单击后退按钮两次以使用 rxjava 退出活动

2024-01-11

寻找一种微妙的接收方法来退出活动,同时按两次后退按钮。

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有运算符间隔(时间单位) http://reactivex.io/documentation/operators/timeinterval.html,这正是我们想要的。 因此,我们有了主题和所需的退出超时。

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击后退按钮两次以使用 rxjava 退出活动 的相关文章

随机推荐

  • Rails - 从我的观点中移出计算?

    目前我正在按照我的观点进行一些计算 这当然是一件坏事 我正在研究可以帮助我重构上述问题的方法 一件事是将计算移至我的控制器 category sum transaction sum amount cents 这可能是更好的解决方案 但你知道
  • 在 Matlab 中制作球的动画

    我有一个包含这两个方程的球 x t v0 cos t 并且 y t h v0 sin t 1 2gt 2 其中 t 0 t Final 是时间变量 h 是高度 v0 是初始速度 是 v0 与水平面形成的角度 g 9 8 m s 2 地板位于
  • 一些Python代码的解释

    这是屏障的基本示例 说明一些线程如何等待进入一个入口屏障和另一个出口屏障 虽然代码很好 但我并没有真正深入了解它是如何工作的 例如 我不明白为什么进入 Barrier 函数的线程在执行 n n 1 后 可以立即使 n n 1 从而影响全局
  • 正则表达式非贪婪(惰性)

    我正在尝试非贪婪地解析 TD 标签 我从这样的事情开始 td stuff td align right More stuff td align left 返回的记录如下 stuff td align right More stuff td
  • 将 À 等特殊字符与常规 A 进行比较

    在某些语言中 有类似的字母 我看到对于表视图部分 本机 iOS 将 在同一部分下A 我想做同样的事情 我通过比较第一个字母来构建我的部分 所以我需要那个 将等于 A 我尝试使用localizedCompare但我仍然不知道这两者是相等的 有
  • 使用 CustomAttributes 与 GetCustomAttributes() 的优点

    今天我注意到我的智能感知中出现了一些新属性System Type我的 NET 4 5 项目的对象 其中有一个叫做CustomAttributes 我对此很感兴趣 因为我之前就明白GetCustomAttributes是最昂贵的反射调用之一
  • C 编程自动八进制解释

    Code 1 int a 0987654321 printf d a Code 2 int a scanf d a printf d a 在这里 如果我们输入 0987654321 那么它会打印相同的内容 但在第一个代码片段中 它会给出一个
  • 基本PHP MySQL数组分组问题

    快速问题 我认为对于像我一样拥有最基本的 PHP MySQL 知识的人来说 这是一个非常简单的解决方案 我有一个存储在数据库中的各个州的城市列表 其中包含城市 州和一些其他变量 现在 它们被提取为按城市名称排序的列表 阿拉斯加安克雷奇 马里
  • DataGridView显示行标题单元格

    我正在尝试显示链接到 DataTable 的简单 DataGridView 并且最终我希望 DataTable 中的第一列成为 DataGridView 的行标题单元格 此时 我将满足于在行标题单元格中包含任何值 我可以显示带有所有行和列以
  • 标识符未定义

    我使用 VS2012 Express 用 C 编写了以下代码 void ac search uint num patterns uint pattern length const char patterns uint num records
  • 卷曲远程图像并调整其大小

    我使用此脚本来下载远程图像并调整其大小 在调整大小部分出现问题 它是什么
  • Android 使用自签名证书连接到服务器

    编辑 下面的代码工作正常 没有错误 没有异常 我知道关于这个主题的大量问题 以及谷歌想到的许多博客 我已通读它们并设法想出我将要解释的内容 我的疑问在于 我的方法正确吗 它有副作用吗 以及在我解释我的方法时最好提出的另一个问题 我基于此方法
  • NIO getParentFile().mkdir() [重复]

    这个问题在这里已经有答案了 有没有一种方法可以一次性创建文件和目录 如下所示 使用 Java 7 和 NIO 路径和文件静态方法 在哪里您不必键入路径 然后将文件分成单独的行 代码 File file new File Library te
  • 当调用clock_gettime()时返回的tv_nsec字段实际上可能超过一秒吗?

    当你调用clock gettime 它返回一个 timespec 结构 struct timespec time t tv sec seconds long tv nsec nanoseconds 我在手册页中没有找到 tv nsec 不会
  • 从连续的字序列中提取任意范围的位的最有效方法是什么?

    假设我们有一个std vector 或任何其他序列容器 有时它是一个双端队列 它存储uint64 t元素 现在 让我们将该向量视为一个序列size 64连续的位 我需要找到由给定的位组成的单词 begin end 范围 鉴于end begi
  • UItableVIew 中的效果或动画

    当我单击 tableView 时 它会显示类似这样的内容以显示详细信息 我怎样才能做到这一点 我认为你需要的是一个类似于手风琴的实现 以下是一些示例参考 您可以从这里开始 如何为 iPhone SDK 应用程序实现手风琴视图 https s
  • 一个由两个弹性项目组成的弹性盒网格,其中一个弹性项目旁边有一个[重复]

    这个问题在这里已经有答案了 我想在左侧放置一个 div 在右侧放置两个 div 这bottomright应始终低于topRight分区这topRight是唯一一个高度可变的 div 我目前正在尝试使用flexbox你可以在我下面的代码中看到
  • OpenCV 上的 Libpng 冲突?

    我正在尝试使用以下代码在 XCode 4 4 Mountain Lion 上打开 png 文件 适用于 jpg 文件 Mat image imread Users user name Desktop result png imshow im
  • Kafka Connect 不支持主题策略

    Context 我编写了几个小代码卡夫卡连接 https docs confluent io current connect index html连接器 一个每秒生成随机数据 另一个将其记录在控制台中 它们集成了一个模式注册表 https
  • 单击后退按钮两次以使用 rxjava 退出活动

    寻找一种微妙的接收方法来退出活动 同时按两次后退按钮 boolean doubleBackToExitPressedOnce false Override public void onBackPressed if doubleBackToE