Androidでマルチスレッド処理を実現する方法には以下の2つがあります。
- Java標準のThreadクラスを使用
- AsyncTaskクラスを使用
今回はJava標準のThreadクラスを使う方法について。
Java標準のThreadクラスを使用
Java標準のThreadクラスを使用することでマルチスレッド処理を実現することができます。
4 | new Thread( new Runnable() |
ここで1つ注意事項があります。
上記コードの8行目にUIにアクセスするような処理を記述して実行してみてください。
例外が発生するかと思います。
これは、AndroidのUIがシングルスレッドモデルであり、対象UIを持つスレッド以外からのUI操作を行うことは禁止されているためです。
とはいっても、別スレッドで何かしらの処理を行い、その結果をUIに反映させたいということもありますよね。
そこで、この問題を解決する術としてHandlerクラスが用意されています。
このクラスのpost()はUIスレッドのメッセージキューに指定した処理をキューイングしてくれるものであり、結果としてUIスレッドでUIアクセス処理が実行されることになります。
手順は・・・
- UIスレッドでHandlerのインスタンスを作成
- Runnableのrun()にUIアクセス処理を実装
- Handlerのインスタンスを使って、UIスレッドに上記Runnableを投げる(postする)
main.xml
1 | <? xml version = "1.0" encoding = "utf-8" ?> |
3 | android:layout_width = "fill_parent" |
4 | android:layout_height = "fill_parent" |
5 | android:orientation = "vertical" > |
7 | android:id = "@+id/btn_Hoge" |
8 | android:layout_width = "wrap_content" |
9 | android:layout_height = "wrap_content" |
10 | android:text = "Button" /> |
13 | android:id = "@+id/tv_Hoge" |
14 | android:layout_width = "wrap_content" |
15 | android:layout_height = "wrap_content" |
TestActivity.java
1 | package com.android.thread; |
3 | import android.app.Activity; |
4 | import android.view.View.OnClickListener; |
5 | import android.os.Bundle; |
6 | import android.os.Handler; |
7 | import android.view.View; |
8 | import android.widget.Button; |
9 | import android.widget.TextView; |
11 | public class TestActivity extends Activity implements OnClickListener |
13 | Handler handler = new Handler(); |
18 | public void onCreate(Bundle savedInstanceState) |
20 | super .onCreate(savedInstanceState); |
21 | setContentView(R.layout.main); |
25 | btnHoge = (Button)findViewById(R.id.btn_Hoge); |
26 | tvView = (TextView)findViewById(R.id.tv_Hoge); |
29 | btnHoge.setOnClickListener( this ); |
32 | public void onClick(View arg0) |
35 | new Thread( new Runnable() |
40 | handler.post( new Runnable() |
44 | tvView.setText( "Changed!" ); |
やり方さえ知っていれば何てことないのですが、初心者が陥りやすい部分でもありますのでタグに「デバッグ」を追加しています。
もう1つのAsyncTaskクラスを使う方法については、近いうちに書きたいと思います。
関連があると思われる記事:
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`grow` not found]