プレゼン配信サービス「ZENPRE」で、次期バージョンに対応したAndroidアプリを作っている際に、
ちょっと詰まった点を1つご紹介します。
ウェブAPIにアクセスしてデータを取る間に別処理を、なんていうことをしたいときは、
別スレッドを定義してその中で処理を書くかと思います。
そして、そのデータ取得でエラーが発生したりしたら、Toastなどでアラートを出すでしょう。
それをやりたくて、以下を書いてみました。
new Thread(new Runnable(){ @Override public void run() { try{ connect("xx.xxx.xxx.xxx",80); } catch (Exception e) { Toast.makeText(PresenImageActivity.this, getText(R.string.alert_fail_connect), Toast.LENGTH_LONG).show(); } } }).start(); |
こういう風にすると、実際にエラーが発生したときに、以下のシステムエラーに出くわします。
java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()
別スレッド内でUIの操作を行うのはだめのようです。
そこでHandlerの登場です。
UI Threadが持つキューにジョブが入り、UIの操作ができるようになります。
というわけで、以下のように書きました。
private final Handler handler = new Handler(); new Thread(new Runnable(){ @Override public void run() { handler.post(new Runnable() { public void run() { try{ connect("xx.xxx.xxx.xxx",80); } catch (Exception e) { Toast.makeText(PresenImageActivity.this, getText(R.string.alert_fail_connect), Toast.LENGTH_LONG).show(); } } }); } }).start(); |
これで、別スレッド内で起きたエラーを表示できるようになりました。
簡単ですが、備忘も込めて。
今回開発したAndroidアプリにも実装したZENPREの新機能、「同期録画コンテンツ」を使って、
見逃した勉強会をいつでも閲覧できる機能の紹介は次回。