前回に引き続き Titanium Desktop。
ちょい前回まで作ったものと、今日進めた部分を記録しようと github にリポジトリを作るようにしました。
https://github.com/hazisarashi/NiconamaWidget/
これでツッコミ入れてくれる優しい人が、いたらきっと入れてくれる!!
TCPSocket
昨日の記事を見て、そもそもSocketが対応してないってのは考えにくいんじゃないか?というツッコミを頂き、色々試して見るもののダメ…。検索してもそれっぽい情報がヒットしない…。英語の記事で見逃してるものがあるかもしれないので、今度再度調べてみます。
Ruby
今日は主にRubyでのチャレンジを。
前回バックグラウンドうんぬんの話をしたら、スレッドがあるじゃないか。ということに気づき挑戦してみました。
Rubyでスレッド → JSのメソッドを実行
これはダメでした。スレッド内から、jsのメソッドを実行しても反応がありません…
jsでsetTimeout → Rubyを実行 → jsのメソッドを実行
ちょっと分かりづらいですが、
setTimeout ( "rubyFunction()", 100 ) として、Rubyのメソッドを実行できます。setTimeoutは単に実行するだけの場合必須じゃないですが、念のため。
その後、Ruby側で Socket接続を行い、Socketで返ってきた値を jsFunction( data ) という形でRubyからjsに渡してあげます。
これはOK!! ただし、ずっと同期でRubyを実行してる状態なので、Rubyのメソッドが死ぬまで画面が固まります orz
jsでsetTimeout → Rubyを実行 → jsのメソッドをTitanium.API.runOnMainThread経由で実行
よくよく調べてみると、Titanium.API.runOnMainThreadとTitanium.API.runOnMainThreadAsyncなるメソッドが。
これは上記のブロックを防ぐためのメソッドらしい。これを使えば間違いなくいけるだろう!!と思ってやってみたのですが、このメソッドを1回実行するだけならOKだが、2回目を実行しようとすると…
Error: "First argument to runOnMainThread was not a function"
こんなエラーが…なんなんだろう…。前回の処理が終わるまで待たないといけないのかな?
まとめ
Titanium.API.runOnMainThread をうまく使えば、RubyでのSocket通信のデータをjsに渡せそう。
なんでエラーが出るのかを突き止めて対応を検討!
頑張れ俺!