- 2012-04-30 (月) 21:53
- Android
Androidでマルチスレッド処理を実現する方法には以下の2つがあります。
- Java標準のThreadクラスを使用
- AsyncTaskクラスを使用
今回はJava標準のThreadクラスを使う方法について。
Java標準のThreadクラスを使用
Java標準のThreadクラスを使用することでマルチスレッド処理を実現することができます。
public void anyFunc()
{
//==== スレッド起動 ====//
new Thread(new Runnable()
{
public void run()
{
// 何らかの処理
}
}).start();
}
ここで1つ注意事項があります。
上記コードの8行目にUIにアクセスするような処理を記述して実行してみてください。
例外が発生するかと思います。
これは、AndroidのUIがシングルスレッドモデルであり、対象UIを持つスレッド以外からのUI操作を行うことは禁止されているためです。
とはいっても、別スレッドで何かしらの処理を行い、その結果をUIに反映させたいということもありますよね。
そこで、この問題を解決する術としてHandlerクラスが用意されています。
このクラスのpost()はUIスレッドのメッセージキューに指定した処理をキューイングしてくれるものであり、結果としてUIスレッドでUIアクセス処理が実行されることになります。
手順は・・・
- UIスレッドでHandlerのインスタンスを作成
- Runnableのrun()にUIアクセス処理を実装
- Handlerのインスタンスを使って、UIスレッドに上記Runnableを投げる(postする)
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_Hoge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/tv_Hoge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hoge"/>
</LinearLayout>
TestActivity.java
package com.android.thread;
import android.app.Activity;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class TestActivity extends Activity implements OnClickListener
{
Handler handler = new Handler();
Button btnHoge;
TextView tvView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//==== コントロール取得 ====//
btnHoge = (Button)findViewById(R.id.btn_Hoge);
tvView = (TextView)findViewById(R.id.tv_Hoge);
//==== リスナ登録 ====//
btnHoge.setOnClickListener(this);
}
public void onClick(View arg0)
{
//==== スレッド起動 ====//
new Thread(new Runnable()
{
public void run()
{
//==== UIスレッドキューにポスト ====//
handler.post(new Runnable()
{
public void run()
{
tvView.setText("Changed!");
}
});
}
}).start();
}
}
やり方さえ知っていれば何てことないのですが、初心者が陥りやすい部分でもありますのでタグに「デバッグ」を追加しています。
もう1つのAsyncTaskクラスを使う方法については、近いうちに書きたいと思います。
関連があると思われる記事:
- [Android] Handler内部クラス実装時の注意点
- [Android] タイマーの使い方
- [C#] サービスのインストールとデバッグ
- [Android] WiFi機能のON/OFF状態取得
- [Android] Backボタンが押されたときの処理
- Newer: [Eclipse] 起動できないときは・・・
- Older: [C++] クラスのメモリコピーにはご用心
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://gacken.com/wp/program/android/878/trackback/
- Listed below are links to weblogs that reference
- [Android] マルチスレッド(その1) from ミライニトドケ