Home > Android > [Android] マルチスレッド(その1)

[Android] マルチスレッド(その1)

Androidでマルチスレッド処理を実現する方法には以下の2つがあります。

  • Java標準のThreadクラスを使用
  • AsyncTaskクラスを使用

 

今回はJava標準のThreadクラスを使う方法について。
 

Java標準のThreadクラスを使用

Java標準のThreadクラスを使用することでマルチスレッド処理を実現することができます。

1public void anyFunc()
2{
3    //==== スレッド起動 ====//
4    new Thread(new Runnable()
5    {
6        public void run()
7        {
8            // 何らかの処理
9        }
10    }).start();
11}

ここで1つ注意事項があります。
上記コードの8行目にUIにアクセスするような処理を記述して実行してみてください。

例外が発生するかと思います。
 

これは、AndroidのUIがシングルスレッドモデルであり、対象UIを持つスレッド以外からのUI操作を行うことは禁止されているためです。
とはいっても、別スレッドで何かしらの処理を行い、その結果をUIに反映させたいということもありますよね。

そこで、この問題を解決する術としてHandlerクラスが用意されています。
このクラスのpost()はUIスレッドのメッセージキューに指定した処理をキューイングしてくれるものであり、結果としてUIスレッドでUIアクセス処理が実行されることになります。

手順は・・・

  1. UIスレッドでHandlerのインスタンスを作成
  2. Runnableのrun()にUIアクセス処理を実装
  3. Handlerのインスタンスを使って、UIスレッドに上記Runnableを投げる(postする)

 

main.xml

1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3    android:layout_width="fill_parent"
4    android:layout_height="fill_parent"
5    android:orientation="vertical" >
6    <Button
7        android:id="@+id/btn_Hoge"
8        android:layout_width="wrap_content"
9        android:layout_height="wrap_content"
10        android:text="Button" />
11 
12    <TextView
13        android:id="@+id/tv_Hoge"
14        android:layout_width="wrap_content"
15        android:layout_height="wrap_content"
16        android:text="Hoge"/>
17</LinearLayout>

 

TestActivity.java

1package com.android.thread;
2 
3import android.app.Activity;
4import android.view.View.OnClickListener;
5import android.os.Bundle;
6import android.os.Handler;
7import android.view.View;
8import android.widget.Button;
9import android.widget.TextView;
10 
11public class TestActivity extends Activity implements OnClickListener
12{
13    Handler handler = new Handler();
14    Button btnHoge;
15    TextView tvView;
16 
17    @Override
18    public void onCreate(Bundle savedInstanceState)
19    {
20        super.onCreate(savedInstanceState);
21        setContentView(R.layout.main);
22 
23         
24        //==== コントロール取得 ====//
25        btnHoge = (Button)findViewById(R.id.btn_Hoge);
26        tvView = (TextView)findViewById(R.id.tv_Hoge);
27 
28        //==== リスナ登録 ====//
29        btnHoge.setOnClickListener(this);
30    }
31 
32    public void onClick(View arg0)
33    {
34        //==== スレッド起動 ====//
35        new Thread(new Runnable()
36        {
37            public void run()
38            {
39                //==== UIスレッドキューにポスト ====//
40                handler.post(new Runnable()
41                {
42                    public void run()
43                    {
44                        tvView.setText("Changed!");
45                    }
46                });
47            }
48        }).start();
49    }
50}

 

やり方さえ知っていれば何てことないのですが、初心者が陥りやすい部分でもありますのでタグに「デバッグ」を追加しています。
 

もう1つのAsyncTaskクラスを使う方法については、近いうちに書きたいと思います。
 
 

関連があると思われる記事:

このエントリーをはてなブックマークに追加
はてなブックマーク - [Android] マルチスレッド(その1)
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`tweetmeme` not found]
[`grow` not found]

Comments:0

Comment Form
Remember personal info

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 ミライニトドケ

Home > Android > [Android] マルチスレッド(その1)

Search
Feeds
Meta
人気の記事

Return to page top