安卓reLaunch在onShow里面报错 can not invoke
发布于 7 年前 作者 weiding 540 次浏览 来自 问答

这是个BUG

我在app.js中的onshow 函数中做了一些逻辑,执行reLaunch方法,在IOS上一点问题没有,在案桌上就报错,can not invoke reLaunch in background  求解?? 又是区别对待咯,请开发大哥们给个明路吧

我不明白的是,既然不能再后台的时候调用,那么onShow里面的代码是在后台执行的?那onShow意义何在?并且IOS机型没有问题,单单是Android机型有问题,这更让我费解。求看到,求关注,求回复,我已经被逼的走投无路了…  

app.js

onShow () {
// 检测app上次启动时间, 如果和当前日期不匹配, 则清空缓存, 重载数据
 let appLastLaunchTime = util.getStorageData('appLastLaunchTime')
if (util.getNowDateString() !== appLastLaunchTime) {
   util.setStorageData('appLastLaunchTime', util.getNowDateString())
this.reLaunchApp()
}
},
reLaunchApp () {
wx.reLaunch({
url: '/pages/home/home'
 })
},
10 回复

@LastLeaf   好的  多谢!

其实可以开放更多的生命周期 ,比如onRoute, 虽然这个生命周期方法我们这边已经做了个框架已经实现了,当然原生支持就更好了

@LastLeaf   这个还真有的,我反馈过这个问题   同事的IPhone 7 不论啥时候打开小程序都不会刷新,用户中也有一定比例的反馈不会刷新的问题。 于是我才出此下策…

我看过文档了,说是5分钟的时间,但实际上不是,很多手机根本不会回收。还有置顶的小程序也不会回收

你好,目前请不要在 onShow 中直接调用 reLaunch 。我们会尝试调整优化一下。

那么onShow里面的代码是在后台执行的

是的,目前页面首次 onShow 的时机是紧接着 onLoad 的,它可能出现在页面完全进入之前。

@LastLeaf   因为我页面比较多,我得在每个页面都要做这个处理, 确实蛮蛋痛的。

还有个问题就是,有些页面的数据时依赖前面页面,所以单单这个页面setData是没用的,最理想的还是要回到首页再去刷新,现在ios倒是没有问题,单单安卓不行… 纠结,我在想想别的办法吧,多谢了

所以是不是我这种情况  暂时无解?

置顶的小程序也不会回收

这种情况是不会的。

其实你的目的是,有时需要强制更新一下数据?我觉得应该有体验更好的方法,比如重新做一次 setData 来重设页面数据。

我们之后会强化这方面的接口,你可以关注一下后续更新。

按照设计,小程序只会在后台驻留几分钟的时间,应该不会有一整天都不重启的问题吧?

@LastLeaf  THX

我之所以会在onShow里面加reLaunch 就是为了解决有时候 ___小程序不会被内存回收导致页面的数据一直不会更新 ___的问题。我的做法是在APP onLaunch记录一个日期到Storage,下次在app onShow的时候拿到当前日期去和上次的时间比对,不是同一天(我们数据一天更新一次)就模拟小程序被回收的场景,关闭所有页面回到首页重新拉取数据。

于是就碰到了上述问题,那么介于此,我貌似除了放在app onShow去检测,没有更好的办法了… 不知道在每个页面的onShow去检测会不会有效果。如果这个也不行,真是没辙了,如果大神有更好的方案,不吝赐教!

回到顶部