在onBackPress中实现退出拦截时不生效

Posted 华为开发者论坛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在onBackPress中实现退出拦截时不生效相关的知识,希望对你有一定的参考价值。

现象描述

在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress控制确认弹窗后自动退出不生效。

问题分析

快应用引擎实现机制决定了onbackpress不能有耗时的操作。当超过一段时间后,如果代码还没有处理完,就会按返回值为false处理,即默认关闭该页面。问题代码中通过$watch监听showResult的变化,若变化则执行fetch操作,而这些操作可能还没执行完,从而导致弹窗自动关闭。
问题代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element(\'textarea\').focus({ focus: false });
5.      this.content = \'\';
6.      this.touchedIndex = -1;
7.      //解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
8.      this.showResult = false;
9.      return true;10.   }
11.   return false;
12. },
13. initDataWatchConfig() {
14.   let that = this;
15.   this.$watch(\'showResult\', (newV, oldv) => {
16.     if (!that.showResult) {
17.       audio.stop();
18.       this.getphoto()//此处是一个比较耗时的操作,以fetch举例,只有清除数据后第一次打开可以复现
19.     }
20.   });
21. },
22. getphoto: function () {
23.   var that = this
24.   fetch.fetch({
25.     url: \' 
26.     success: function (ret) {
27.     },
28.     fail: function (msg, code) {
29.     }
30.   })}

解决方法

给耗时比较长的操作增加延时。为this.showResult = false增加一个延时,优化后的代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element(\'textarea\').focus({ focus: false });
5.      this.content = \'\';
6.      this.touchedIndex = -1;
7.      //增加延时,解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
8.      setTimeout(() => {
9.          this.showResult=false; 
10.     }, 800);
11.     return true;
12.   }
13.   return false;
14. }

原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0204411119222660356?fid=18

原作者:Mayism

以上是关于在onBackPress中实现退出拦截时不生效的主要内容,如果未能解决你的问题,请参考以下文章

在fragment中实现返回键单击提醒 双击退出

Android 在fragment中实现返回键单击提醒 双击退出

颤振:如何在按下后退按钮时不退出应用程序

android检测返回键onBackPressed和onKeyDown区别

我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器

使用 onBackPressed 仅从第一个片段退出 App