minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

各種 Tips です。
まとまったらどこかのページに移動させます。

Thread と Handler

Android では、コンポーネント関連の全ての処理をメインスレッドで実行します。
この為、時間が掛かる処理は新しくスレッドを作ってそこで実行させるようにします。

ただし、画面更新系の処理は別スレッド内で行おうとしてもうまくいきません。
これは SWT 等と同じ挙動で、SWT の場合はエラーになります。
Android ではエラーにはなりませんが、画面が更新されないのでこの問題を解決する必要があります。

Handler クラスを使えば、別スレッドからメインスレッドに処理を投げることが出来ます。

Handler = new Handler(); // この行はメインスレッド内で実行される
new Thread() {
    public void run() {
        ...
        ... 時間の掛かる処理(ここでは画面更新しない)
        ...
        handler.post(new Runnable() {
            public void run() {
                // 画面更新関連の処理
            }
        });
    }  
}.start();

SWT の asyncExec と同じように、post 内の処理は非同期で実行されます。
具体的に言うと、post メソッドはこの Runnable を handler インスタンスのスレッドが持つ
MessageQueue に追加します。
ここでは、Handler を new したスレッドがメインスレッドになりますので
メインスレッド用の MessageQueue に追加されたことになります。
あとはメインスレッドがこの MessageQueue を処理します。
メインスレッドなので当然画面更新系の処理を行うことができます。

こうやって、時間の掛かる処理と画面更新系の処理を分離しましょう。