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

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

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アクセス処理が実行されることになります。

手順は・・・

  1. UIスレッドでHandlerのインスタンスを作成
  2. Runnableのrun()にUIアクセス処理を実装
  3. 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] マルチスレッド(その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