Posted at 2013-01-28 14:54:41 under テクノロジ (by key)

メモです。

ここ2週間くらいApache Cordovaのプラグインを書いてたりします。 Android実行中にブレイクポイントを貼っていない ExposedJSApi.class の jsMessageQueue.setPaused(false); という箇所で止まることがありました。 具体的にはexec()の中。

デバッガで注意深く追いかけて行くとUI更新の際に停止することが解りました。 手元のコードではsetImageDrawable()を実行している所で発生。


// ボタンのDrawableを更新する
button.setImageDrawable(states);

ひょっとして例外が発生しているのではないか?と考え例外をまるっと拾ってログを書きだしてみると、 Only the original thread that created a view hierarchy can touch its views. というエラーが。 どうやらUIThread以外で画面描画を行おうとしていたことが問題のようでした。

次のようにRunnableで括ってあげたら解決。


runOnUiThread(new Runnable() {
    public void run() {
        button.setImageDrawable(states);
    }
});

まとめ。

  • Cordoavaプラグイン実行中、Java内で上がった例外はExposeJsApiまで突き抜けてしまう
  • Cordova ExposeJsApiに突き抜けた例外は詳細なメッセージが表示されない(!)
  • 画面描画はUIThreadで行いましょう

典型的な落とし穴だと思うのですがあんまり情報なかったですね。

blog comments powered by Disqus