WL 5.0.6.1 Android - 直接更新使 Native/Cordova 资源保持活动/在内存中(例如 BusyIndicator),但引用丢失
Posted
技术标签:
【中文标题】WL 5.0.6.1 Android - 直接更新使 Native/Cordova 资源保持活动/在内存中(例如 BusyIndicator),但引用丢失【英文标题】:WL 5.0.6.1 Android - Direct Update keeps Native/Cordova resources active/in memory (e.g. BusyIndicator) but reference is lost 【发布时间】:2013-09-04 20:17:08 【问题描述】:当我们有以下序列时,我们遇到了问题:
应用启动 网络资源开始 显示忙碌指示符 (1) 连接到 WL 服务器 触发直接更新 Web 资源重启 显示忙碌指示符 (2) 连接到 WL 服务器 成功 加载并更改为欢迎页面 隐藏忙碌指示符 (2)这样的效果是,在直接更新的网络资源中,我们(当然)丢失/丢失了对繁忙指示器 (1) 的引用,并且在触发直接更新后我们无法隐藏该指示器。那么,我们有两个指标 (1) (2) 打开,只有一个 (2) 关闭,旧的 (1) 永远向上。
一种解决方案是在触发/执行直接更新之前获取一个事件......我们可以隐藏我们的指标 (1)。这将变得与这个问题非常相似:IBM Worklight - How can I execute javascript code before updating the application?
更通用的方法是触发应用程序的“更深”重启……这意味着还要重启本机 shell 和所有 cordova 资源。那么所有的原生资源,比如忙碌指示器和其他东西都应该被移除和重置,对吧?
有没有什么办法可以实现直接更新后应用的这种“深度”重启?这个问题已知吗?
9 月 5 日更新
我们看到在 DirectUpdate 重新启动 Web 资源之前的某个时间触发了以下事件:
window.addEventListener("beforeunload",
function()
WL.Logger.debug("busy test - unload2");
app.busytest.hide();
, false);
window.addEventListener("unload",
function()
WL.Logger.debug("busy test - unload3");
app.busytest.hide();
, false);
...但不幸的是,隐藏我们的 WL.BusyIndicator “busytest”不再适用于这些事件。有人有什么想法吗?
但如果是 DirectUpdate,也许其他一些清理代码可以放在那里?
【问题讨论】:
【参考方案1】:忙碌指示器是一个单例。如果您创建了几个繁忙的指标,显示它们然后隐藏它们 - 所有都将被隐藏。
【讨论】:
你会认为是这样的......但事实并非如此。如上所述,当在 DirectUpdate 之前“显示”忙碌指示符时,在 DirectUpdate 之后“隐藏”忙碌指示符不再起作用 - 因为您必须在代码中的某个位置调用var busytest = new WL.BusyIndicator('content', text : 'Loading...');
并且在 DirectUpdate 之后再次执行此 get . - 甚至在“unload”和“beforeunload”事件中“隐藏”指标的旧实例也不再起作用了!
FYI ...我们目前在带有 Nexus4 android 4.3 API 18 的 Android 模拟器中看到了这一点。在 iPhone 模拟器上它似乎没问题,而且在 DirectUpdate 之后忙碌似乎消失了。我们将看看是否可以在设备上进行测试……尽管如果模拟器中已经出现错误,则不打算这样做。
在安卓手机 LG Optimus 4.1.2 上测试。存在同样的问题...当 DirectUpdate 完成时 BusyIndicator 不会停止/隐藏。在 DirectUpdate 之后,对 BusyIndicator 的 javascript 引用消失了。在“新”指标对象上调用“隐藏”(甚至多次)不会隐藏在 DirectUpdate 之前仍然可见/覆盖的指标对象。
尝试创建新的busyIndicator并首先调用busy.show()。然后调用busy.hide()。由于busyIndicator 的异步特性,您可能需要在setTimeout 内调用busy.hide() 50-100 毫秒。
我不确定我是否理解你的建议......我现在做的是 1. 新的 BusyIndicator 并显示在 wlCommonInit 2.client.connect 3. onSuccess 和 onFailure busy.hide。 ... 现在使用 DirectUpdate 1. 和 2. 由于 Web 资源的重新启动而执行了两次。 3. 只有一次....即使我在 onFailure 和 onSuccess 中放了 5 或 6 个 busy.hide,它也不会隐藏第一个 Busy Indicator .... 你现在建议在 onSuccess 和 onFailure 中放一个 setTimeout 吗?这真的会改变什么吗?以上是关于WL 5.0.6.1 Android - 直接更新使 Native/Cordova 资源保持活动/在内存中(例如 BusyIndicator),但引用丢失的主要内容,如果未能解决你的问题,请参考以下文章
从 WL6.3 迁移后,Android 中的 IBM MobileFirst 7.1 服务器连接失败
通过不同的 URL 将一些 WL.Client 适配器调用流量重新路由/转移到 WL 服务器(用于 PCI 支付和安全要求)?