웹브라우저에서 동작하는 자바스크립트는 싱글 스레드로 동작한다.
즉, 어떤 코드를 실행하던간에 순차적으로 실행되고, 이 순서에 따라 의존성도 생긴다.
하지만 타이타늄 모바일의 경우 두가지 방법으로 윈도우를 열수있다.
1. 싱글 스레드로 윈도우 열기
[app.js]
var parentWin = Ti.UI.createWindow();
var button = Ti.UI.createButton();
button.addEventListener(“click”, function(e){
var childWin = Ti.UI.createWindow();
childWin.open();
});
parentWin.add(button);
parentWin.open();
위와 같이 같은 파일 안에서 윈도우를 정의할 경우 같은 스레드에서 윈도우가 열린다.
2. 멀티 스레드로 윈도우 열기
멀티 스레드로 윈도우를 열려면, 다음과 같이 윈도우 생성시 URL 속성을 지정한다.
[app.js]
var parentWin = Ti.UI.createWindow();
var button = Ti.UI.createButton();
button.addEventListener(“click”, function(e){
var childWin = Ti.UI.createWindow({ url: “./childWindow.js” });
childWin.open();Ti.App.fireEvent(“fooEvent”, {data:”message”});
});
parentWin.add(button);
parentWin.open();[childWindow.js]
var win = Ti.UI.currentWindow;
Ti.App.addEventListener(“fooEvent”, function(e){
Ti.API.info(e.data + ” got it!”);
});
위와 같이 url로 지정하면 childWindow.js 파일 안에 정의된 내용은 다른 스레드로 동작한다.
따라서, 두 윈도우 사이에 데이터를 전송하려면 약간의 시차가 생길수 있다.
예를 들어, 자식 윈도우를 열고
1. childWindow.open()
바로 윈도우로 메시지를 날리면,
2. Ti.App.fireEvent(“fooEvent”, {data:”message”});
자식 윈도우에서 메시지를 받아야하는데 받지 못한다.
3. Ti.App.addEventListener(“fooEvent”, function(e){ Ti.API.info(e.data + ” got it!”); });
따라서 URL을 이용해 윈도우를 열 경우엔, 스레드 생성시간만큼의 약간의 딜레이를 주어야한다.
var childWin = Ti.UI.createWindow({ url: “./childWindow.js” });
childWin.open();
setTimeout(function(){Ti.App.fireEvent(“fooEvent”, {data:”message”});
}, 100);
});