【问题标题】:How to stop/cancel a runnable when pressing on android phone's back button?按下android手机的后退按钮时如何停止/取消可运行?
【发布时间】:2021-06-11 09:53:58
【问题描述】:

在我的项目中,我有一个名为“ExamMenuActivity”的活动,我可以在“加法、减法、乘法和除法”活动之间进行选择。

在加法活动(称为 ExamAdditionActivity)中,我有一个处理程序方法可以在给定答案后重新生成问题表单。一切似乎都很好,我可以生成问题并给出答案,给出答案后,2 秒内就会生成一个新问题。

我遇到的问题是,在我对问题给出正确或错误的答案后,在 2 秒内,如果我快速按下手机的后退按钮并且不等待问题重新生成,我根据需要返回“考试菜单”页面(返回 ExamMenuActivity),但屏幕变回 ExamAdditionActivity,我再次看到新生成的问题。

因此,当我在问题重新生成之前按下手机的后退按钮时,我希望能够再次回到考试菜单活动,并且我不想用新生成的问题再次面对 ExamAdditionActivity(比如说在回答了一个附加问题后我改变了主意,我想从菜单中选择另一个活动,我没有等待至少 2 秒)。 我尝试使用 onBackPressed 方法覆盖活动:

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

但不幸的是,这不起作用。

这是我重新生成问题的方法。我基本上用一个处理程序在两秒钟内重新启动相同的活动(我的处理程序代码中有一个可运行但由于它显示为匿名,android studio 让我将其更改为 lambda 函数):

private void regenerateQuestion() {
        new Handler().postDelayed(() -> {
            Intent restartExamAdditionActivity = new Intent(ExamAdditionActivity.this, ExamAdditionActivity.class);

            overridePendingTransition(0, 0);
            startActivity(restartExamAdditionActivity);
            finish();
            overridePendingTransition(0, 0);
        }, TIME_OUT);

    }

尽管我不确定,但我认为我在按钮侦听器区域遇到了问题,因为我给出了问题的答案并在每个按钮下调用 regenetate() 方法。

希望我的问题能得到解答。非常感谢您过来查看我的帖子!

【问题讨论】:

  • 您的问题包含很多不必要的信息和代码。将来,您应该专注于提供特定问题的最小相关示例。这里的很多读者都不想花几个小时在你的代码中寻找相关的部分。只是一个提示。

标签: java android android-activity back-button android-handler


【解决方案1】:

Handler 创建为类的成员变量,如下所示:

Handler myHandler = new Handler();

Runnable 创建为类的成员变量,如下所示:

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        Intent restartExamAdditionActivity = new Intent(ExamAdditionActivity.this, ExamAdditionActivity.class);

        overridePendingTransition(0, 0);
        startActivity(restartExamAdditionActivity);
        finish();
        overridePendingTransition(0, 0);
    }
};

使用新变量发布Runnable

myHandler.postDelayed(myRunnable, TIME_OUT);

当您想取消重新生成时,请执行以下操作:

myHandler.removeCallbacks(myRunnable);

【讨论】:

  • 亲爱的@David Wasser。我真的很感谢你的回答。这正是我尝试过的。我在我的 void regenerate 方法中尝试了这两个成员变量,例如:private void regenerateQuestion(Handler myHandler, Runnable myRunnable) { myHandler.postDelayed(myRunnable, TIME_OUT); }
  • 然后尝试在覆盖 onBackPressed 方法中使用这些变量,例如:@Override public void onBackPressed(Handler myHandler, Runnable myRunnable) { super.onBackPressed(); myHandler.removeCallbacks(myRunnable); this.finish(); } 但随后我收到错误通知“方法未覆盖其超类中的方法”我只是无法找出是什么我做错了。
  • 请编辑您的问题并发布新代码 sn-ps。试图阅读评论中的代码是痛苦和困惑的。
  • 啊...我明白了问题所在。您不需要将变量传递给任何一种方法。由于regenerateQuestion()Activity 的一个方法,它可以访问Activity 中的所有成员变量。此外,onBackPressed() 是从 Android 框架调用的方法,它不接受任何参数。只需从 regenerateQuestion()onBackPressed() 的声明中删除参数即可。
  • 谢谢@David Wasser。我试图对我的问题更准确,并按照您的建议对其进行了编辑。我还更新了我的代码并从 regenerateQuestion()onBackPressed 声明中删除了参数。我现在可以停止运行。非常感谢!我非常感谢您的努力。
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多