Windowの遷移

Titaniumのアプリの画面遷移を変更する必要があったんだけど、期待通りの動作が記述できずに半日悩んだ。結局setTimeoutを使うという荒業で対応。

win1
win2
win3
と順に遷移する画面があったとして、win2からwin3を表示したあと、戻るキーで戻るときはwin2ではなくwin1へ直接戻って欲しい場合。
当然そのままではwin1→win2→win3⇒win2⇒win1と遷移するんだけど、win2からwin3に遷移するときにwin2を破棄しておくことで対応できると考えた。
で、win2で
win3.open({animate: true});
とかしたあとに
win2.close();
としてみたんだけど、どうも上手く行かない。
どうもwin3.open(…);を実行したあと、win3が閉じられてからwin2.close();が実行されているっぽい。

UIスレッドだけで処理してる影響だと思い、なんとか別スレッドで、非同期に画面遷移をコントロールしたいと思ったところ、他の部分のアニメーションで使用していたsetTimeout();を思い出した。

win2の該当部分で、
setTimeout(function(){
win3.open({…});
win2.close();
}, 5);
という風に、5msecという一瞬の遅延後に非同期で画面遷移を実行するように記述してみた。

期待通りに動作。
変な(イレギュラーな)画面遷移をする時は、普段意識しなかったスレッドの概念も考慮する必要があるのね。