Titanium & Alloy - 临时 window 在被杀死时关闭整个应用程序
Titanium & Alloy - temporary window closes entire app when killed
我有2个windows开,一个主用;和 "popup" 加载 window 应该只显示几分钟。
当我尝试
loading.close();
加载屏幕,所有 windows 立即关闭。没有错误代码或任何东西,应用程序直接关闭,因为屏幕上没有更多 views/windows。
但是我从来没有关闭主 "index" 视图,所以我不明白为什么它会消失。
我的主要想法是使用
loading.hide();
为了隐藏加载屏幕并允许其余部分继续,但是当隐藏执行时,应用程序不会触发或响应任何事件,直到手动强制关闭。
多一点代码:
index.js
var loading = Alloy.createController("loading").getView();
function updateMainMenu() {
if (Ti.App.dataReady){
//Actually create the main menù, only if data is available.
//Cut out of snippet due to sheer length.
//When menù is complete, close the loading window.
loading.close(); //##### THIS CLOSES ENTIRE APP #####
}
}
//##### IF LOADING IS HIDDEN INSTEAD, EVENTS NEVER TRIGGER #####
//When a list element is clicked open the corresponding page.
function onListClick(e) {
var win = Alloy.createController('controlPage', e.row.data).getView();
win.open();
}
//Loads the View, displays it and keeps it updated.
$.index.open();
loading.open();
setInterval(updateMainMenu, 2000);
loading.js/tss/xml 没有关于这个问题的相关代码,至少我是这么认为的。它只有一个 window 和一个图像每半秒更改一次的 imageView,并且在关闭之前它可以正常工作。
备注:
- 全局变量Ti.App.dataReady来自后台任务(另一个文件,工作正常);
- 事件 onListClick 已正确绑定并且有效(如果我没有首先打开加载)
您可以尝试的一件事是在您打开第二个 window 之前收听在主 window 上触发的 "open" 事件。当我不等待 window 打开时,我有过类似的奇怪行为。
首先,尽量不要使用 index.open,因为它指的是 "file" 而不是实际的 window。确保在 tss 文件中为 window 使用 id 并使用那个 .open(),希望看到您的完整索引控制器以提供更准确的答案。
然后你同时打开两个windows。尝试像这样连续打开两个 windows 可能会给您带来竞争条件。如前所述,在打开任何覆盖 window.
之前,请确保您的第一个 window 已打开
一个很好的建议,因为你在这里制作跨平台应用程序是为了确保一切(windows 对于所有平台都是不同的,iOS,Android 和 Windows).对于 Android,第一个 window 是关键的,将成为根 window。如果有任何机会你的覆盖 window 首先完成(是的,有些事情是异步的)那么你的覆盖是根,关闭它会根据 Android 文档关闭你的应用程序。
所以,在打开其他任何东西之前,请始终确保您的第一个 window 是 "done"。侦听打开事件,然后打开覆盖。
现在,如果您希望它看起来不错,您可能需要在 XML 文件中指定带有两个视图的主要 window。从列表 window 上的 "hide" 和覆盖层上的 "show" 开始。这样你就可以随时换班了。然后,如果您愿意,可以重复使用叠加层 "progress" window。
在我的应用程序中,我在小部件中使用了一个视图,因此我不必使用 show/hide,这样我也可以重复使用它。我想这是一个风味问题(除非我们开始谈论内存占用)
希望这对你有意义...
我有2个windows开,一个主用;和 "popup" 加载 window 应该只显示几分钟。
当我尝试
loading.close();
加载屏幕,所有 windows 立即关闭。没有错误代码或任何东西,应用程序直接关闭,因为屏幕上没有更多 views/windows。 但是我从来没有关闭主 "index" 视图,所以我不明白为什么它会消失。 我的主要想法是使用
loading.hide();
为了隐藏加载屏幕并允许其余部分继续,但是当隐藏执行时,应用程序不会触发或响应任何事件,直到手动强制关闭。
多一点代码:
index.js
var loading = Alloy.createController("loading").getView();
function updateMainMenu() {
if (Ti.App.dataReady){
//Actually create the main menù, only if data is available.
//Cut out of snippet due to sheer length.
//When menù is complete, close the loading window.
loading.close(); //##### THIS CLOSES ENTIRE APP #####
}
}
//##### IF LOADING IS HIDDEN INSTEAD, EVENTS NEVER TRIGGER #####
//When a list element is clicked open the corresponding page.
function onListClick(e) {
var win = Alloy.createController('controlPage', e.row.data).getView();
win.open();
}
//Loads the View, displays it and keeps it updated.
$.index.open();
loading.open();
setInterval(updateMainMenu, 2000);
loading.js/tss/xml 没有关于这个问题的相关代码,至少我是这么认为的。它只有一个 window 和一个图像每半秒更改一次的 imageView,并且在关闭之前它可以正常工作。
备注:
- 全局变量Ti.App.dataReady来自后台任务(另一个文件,工作正常);
- 事件 onListClick 已正确绑定并且有效(如果我没有首先打开加载)
您可以尝试的一件事是在您打开第二个 window 之前收听在主 window 上触发的 "open" 事件。当我不等待 window 打开时,我有过类似的奇怪行为。
首先,尽量不要使用 index.open,因为它指的是 "file" 而不是实际的 window。确保在 tss 文件中为 window 使用 id 并使用那个 .open(),希望看到您的完整索引控制器以提供更准确的答案。
然后你同时打开两个windows。尝试像这样连续打开两个 windows 可能会给您带来竞争条件。如前所述,在打开任何覆盖 window.
之前,请确保您的第一个 window 已打开一个很好的建议,因为你在这里制作跨平台应用程序是为了确保一切(windows 对于所有平台都是不同的,iOS,Android 和 Windows).对于 Android,第一个 window 是关键的,将成为根 window。如果有任何机会你的覆盖 window 首先完成(是的,有些事情是异步的)那么你的覆盖是根,关闭它会根据 Android 文档关闭你的应用程序。
所以,在打开其他任何东西之前,请始终确保您的第一个 window 是 "done"。侦听打开事件,然后打开覆盖。
现在,如果您希望它看起来不错,您可能需要在 XML 文件中指定带有两个视图的主要 window。从列表 window 上的 "hide" 和覆盖层上的 "show" 开始。这样你就可以随时换班了。然后,如果您愿意,可以重复使用叠加层 "progress" window。
在我的应用程序中,我在小部件中使用了一个视图,因此我不必使用 show/hide,这样我也可以重复使用它。我想这是一个风味问题(除非我们开始谈论内存占用)
希望这对你有意义...