デジタルコンテンツの制作

nekosuko.jp

ブログ

Titaniumで処理を一時停止する方法

更新日:

処理のタイミングを制御したい

ゲームアプリで次の処理に行く前にちょっと間を置きたいときがよくあります
C言語には標準でsleep関数というものがあって、指定した時間で処理を一時停止してくれます。
残念ながらTitaniumのAPIにもJavascriptにも処理を一時停止してくれる関数がありません。

sleep関数の実装

ということで無いものは作るしかありません。ネットで調べたらいろいろとコードが出てきます。
私がいつもつかっているのは次のような処理です。

sleep = function(ms) {
var d1 = new Date().getTime();
var d2 = new Date().getTime();
while( d2 < (d1 + ms) ) {
d2 = new Date().getTime();
}
return;
};

要するに時間を記録して、一定の時間になるまでループ処理をしておくという方法です。

注意点

このsleep関数はとても便利なんですが、私が使っていてはまったこと(バグの原因となったこと)があります。
それはTitaniumでsleep関数を使うと、処理は一時停止できるのですが停止中の間もタッチイベントなどの処理は受け付けているようです。
そのため、処理を止めているあいだに画面を何回もタッチすると、sleepが終わって処理が再び動き出すときにタッチイベントがタッチされた回数分まとめて呼び出されます。このイベント処理が重ための処理にしているといっせいに呼び出されたときにフリーズしてしまうことがあります。

タッチイベントも受け付けないようにするには

Titaniumで上記のような問題を回避するために、sleep関数の処理の最初にイベントがないviewを貼付け、sleep関数の処理が終わるときにviewを外すという方法によって、他のviewのタッチイベントを発生させないようできます。
※もっと賢いやり方があるかもしれません

なお、sleep処理中はsetInterval関数などのタイマー系処理も停止します。

-ブログ

Copyright© nekosuko.jp , 2020 All Rights Reserved.