{ 2010.11.25 }

Androidでスレッド内でアラートを出すと

    はてなブックマーク - Androidでスレッド内でアラートを出すと
    このエントリーをはてなブックマークに追加

    プレゼン配信サービス「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の新機能、「同期録画コンテンツ」を使って、
    見逃した勉強会をいつでも閲覧できる機能の紹介は次回。

    Comments are closed.