2011年9月4日日曜日

・ 非同期処理②

前回の続き・・・やけどその前に訂正。

スレッドはAndroidの仕組みや!!
みたいに書きましたが、全然Javaそのものの機能です。
今日はさらにそのスレッドからUIをいじるお話です。

前回、UIスレッド以外でUIをいじる事が出来ないといいました。
これは、シングルスレッドモデルを採用しているAndroidにとって、
UIはUIスレッドが持っているものであり、それ以外のスレッドから
操作される事は、そのモデルに反しているからです。

それを解決する方法のひとつにHandlerという物があります。
これが何かというと、疑似マルチスレッドモデルを生成するもので、
具体的に何をしているかと言うと、UIスレッドのキューに別スレッドで
実行しようとしている処理を追加しています。
要するに、処理をメインのお尻にくっつけちゃうんですね。

や、全然要するにになってないか。


実装は

Handler handle = new Handler(); 

public void OnClick(View v) { 
    new Thread(new Runnable() { 
        public void run() { 
            handle.post(new Runnable() { 
                public void run() { 
                    /* 処理を書く */ 
                }  
            }); 
        }); 

ハンドラクラスを生成して、それをメソッド内に実装する。
handle.post()で実際に処理を投げます。
注意点はHandlerの生成位置で、もしもメソッド内部で生成すると、それは
違うスレッドを示すことになってしまい、エラーが起きます。
必ずフィールドに宣言しましょう。
これで実際にUIをいじることができるんですけど、とても見にくいですね。
ちなみに、これもJavaの標準クラスの一つなんですよ。

Androidはこれらの処理をもっと視覚的にわかりやすく書きなおせるクラスがあります。
内部処理はほとんど一緒なんで、書きなおすだけです。

それが、AsyncTaskクラスです。
ちなみに、Androidの昔のバージョンにはないそうですが、名前が違うだけで、
Android1.0と1.1ではUserTaskって名前のクラスらしいです。

さて、このAsyncTaskの使い方、ですがHandlerよりも当然簡単です。
が、ちょっと面倒なのは、クラスを作ったほうが良いということでしょうか。

public class Test extends AsyncTask<params, progress, result> {

    protected result doInBackground(params) {
        /* 非同期で行う処理 */
    }

    protected void onPostExecute(result) {
        /* バックグラウンドでの処理が終わってからUIで実行する処理 */
    }
}

こんなんを作成して、メインの方で

Test test = new Test();
test.execute();
でもしてくれたら大丈夫です。

extendsの横の<>に囲まれてるの。
あれはジェネリックスと言って、この型だけ!ってするもんです。
すいません、実はまだ理解が浅いので、ここはもっかい勉強します。

その中に表わしているのは、ひとつめparamsはどInBackgroundの引数で、
resultはその返り値、またonPostExecuteの引数の型を指定します。
これだけで、非同期処理が実装完了です!
以上。

0 件のコメント:

コメントを投稿