をやってみた。取り合えず、エミュレータ(Android 2.2)で動かしてみている。
取り合えず、WebView で WebSocket できるかなーということで、
WebView のHTMLに Socket.io で通信するようなコードを書いてみたけど、
残念ながら、xhr-polling でやりとりするみたい。
接続が切れてしまうことがあるみたいなので、こりゃーだめだなー。
エミュレータ上で動くAndroidのバージョンを上げればいいのかも知れないけど、
前にバージョンをあげたらおかしなことになったので(笑)、やめておくことにします。
てか、動かして判ったけど、
WebViewのhtmlにDOMのデータを書き込む(つか、画像とかも読み込む)のにスゲーパワーを使うらしく、落ちる。
一気にデータを読み込むからねぇ。
前に書いたWebSocketプロトコルを Titanium にしゃべらせるやつでやってみます。
http://blog.masuidrive.jp/index.php/2011/12/04/socket-with-titanium/
これね。
つか、これを機会にコードを全部書き直そう。そうしようそうしよう。
Javascript 関係の何かしらを書いています。
node.js / Titanium Mobile / Three.js 等など。
仕事探してます。のんびり屋さんです。
Twitter @psychedesire です。
2012年2月3日金曜日
2012年1月10日火曜日
Titanium の WebView で jQuery 読み込み時の遅延
すげーハマってました。
なかなかどうして難しいですね。
なんだろう。単純に考えると、
var win = Ti.UI.createWindow();
var wv = Ti.UI.createWebView({url:"html/test.html");
win.add(wv);
win.open();
wv.addEventListener("load",function(){
wv.evalJS("testFunc()");
});
ってやれば、WebViewであるwvの読み込み完了時に、
WebView で読み込んでいる test.html に記述された testFunc() が実行されるんだけど、
その test.html を読み込んだからといって、
test.html で script src してる CDN 上の jQuery.js の読み込みが完了していないっていう場合があるっぽい。
testFunc内で、$ とか使っていて、jQuery の読み込みが終わっていなければ、当然実行エラーになる。
んで、最初はどうしたかというと、
html/jQuery.js みたいに、ローカルにおいて、それを読み込めばいいじゃん!って思った。
しかしながら、なんか、Titanium で アプリを Deploy (製品状態にコンパイルする)時に、
jQuery.js でコンパイルエラーみたいになってうまくいかなかった。
仕方が無いから、 html/test.html に、 jQuery.js の中身を書いてやれ!と思って書いたんだけど、
今度は test.html のコンパイルエラーみたいになった。
まぁ、読み込んでいたのが jQuery1.6.2 だったからなのかもしれないけど。
仕方が無いので、wv.addEventListener() を書き換えました。
var win = Ti.UI.createWindow();
var wv = Ti.UI.createWebView({url:"html/test.html");
win.add(wv);
win.open();
wv.addEventListener("load",function(){
var timer = setInterval(function(){
var jQReady = wv.evalJS("$.isReady");
if(jQReady){
clearInterval(timer);
wv.evalJS("testFunc()");
}
},100);
});
0.1秒毎にjQueryの準備が出来たかどうかを返す、$.isReady を WebView に投げて、
jQuery の読み込みが無ければ $ もなにも無いんで、何も返ってこないんだけど、
読み込みが完了したら true が返るので、
そしたらタイマーをはずして testFunc を実行するようにしてみた。
一応は、動いてはいるんだけど、大丈夫かなー。
Android は、なんだか動きが良くわかりません。機種ごととかによって違うのかもだし。
なかなかどうして難しいですね。
なんだろう。単純に考えると、
var win = Ti.UI.createWindow();
var wv = Ti.UI.createWebView({url:"html/test.html");
win.add(wv);
win.open();
wv.addEventListener("load",function(){
wv.evalJS("testFunc()");
});
ってやれば、WebViewであるwvの読み込み完了時に、
WebView で読み込んでいる test.html に記述された testFunc() が実行されるんだけど、
その test.html を読み込んだからといって、
test.html で script src してる CDN 上の jQuery.js の読み込みが完了していないっていう場合があるっぽい。
testFunc内で、$ とか使っていて、jQuery の読み込みが終わっていなければ、当然実行エラーになる。
んで、最初はどうしたかというと、
html/jQuery.js みたいに、ローカルにおいて、それを読み込めばいいじゃん!って思った。
しかしながら、なんか、Titanium で アプリを Deploy (製品状態にコンパイルする)時に、
jQuery.js でコンパイルエラーみたいになってうまくいかなかった。
仕方が無いから、 html/test.html に、 jQuery.js の中身を書いてやれ!と思って書いたんだけど、
今度は test.html のコンパイルエラーみたいになった。
まぁ、読み込んでいたのが jQuery1.6.2 だったからなのかもしれないけど。
仕方が無いので、wv.addEventListener() を書き換えました。
var win = Ti.UI.createWindow();
var wv = Ti.UI.createWebView({url:"html/test.html");
win.add(wv);
win.open();
wv.addEventListener("load",function(){
var timer = setInterval(function(){
var jQReady = wv.evalJS("$.isReady");
if(jQReady){
clearInterval(timer);
wv.evalJS("testFunc()");
}
},100);
});
0.1秒毎にjQueryの準備が出来たかどうかを返す、$.isReady を WebView に投げて、
jQuery の読み込みが無ければ $ もなにも無いんで、何も返ってこないんだけど、
読み込みが完了したら true が返るので、
そしたらタイマーをはずして testFunc を実行するようにしてみた。
一応は、動いてはいるんだけど、大丈夫かなー。
Android は、なんだか動きが良くわかりません。機種ごととかによって違うのかもだし。
登録:
投稿 (Atom)