Androidでは、マルチスレッド化の方法として、以下のいづれかを選択することができます。
- Java標準Threadクラスを使う
- Androidで提供されているAsyncTaskを使う
その1では、1番のJava標準Threadクラスを使った例を説明します。
まず、Activity起動直後にプログレスダイアログを表示し、バックグランド処理用のThreadを起動するコードを見てみましょう。
(動作しない不完全コード例)
1 | package com.team_hiroq.sample; |
3 | import android.app.Activity; |
4 | import android.os.Bundle; |
5 | import android.view.View; |
6 | import android.view.View.OnClickListener; |
7 | import android.widget.TextView; |
9 | public class ThreadSample1 extends Activity implements OnClickListener{ |
13 | public void onCreate(Bundle savedInstanceState) { |
14 | super .onCreate(savedInstanceState); |
15 | setContentView(R.layout.theadsample1); |
18 | mTextView = (TextView)findViewById(R.id.ThreadSample1); |
20 | findViewById(R.id.ThreadSample1).setOnClickListener( this ); |
24 | public void onClick(View arg0) { |
26 | ( new Thread( new Runnable() { |
33 | mTextView.setText( "Thread Samples" ); |
これを実行するとすぐわかりますが、mImage.setBackgroundDrawableを実行したタイミングで例外が発生します。これは、Androidでは、UIに関する処理は、UIのThreadからしか処理できない仕組みになっているためです。
上記の例で言えば、ImageViewが属するUIスレッドとsetBackgroundDrawableを実行しようとしているスレッドが異なるため例外が発生しています。
この問題を解決をするための機構として、AndroidではHandlerクラスが提供されており、別スレッドからUIの処理を行いたい場合、Handler経由でUIの処理を実行します。
使い方は以下の2ステップです
- HandlerクラスのインスタンスをUIスレッドで作成
- Handler.postにRunableを渡して、Runable.runの中でUI関連の処理を実行
1 | package com.team_hiroq.sample; |
3 | import android.app.Activity; |
4 | import android.os.Bundle; |
5 | import android.os.Handler; |
6 | import android.view.View; |
7 | import android.view.View.OnClickListener; |
8 | import android.widget.TextView; |
10 | public class ThreadSample1 extends Activity implements OnClickListener{ |
11 | Handler mHandler = new Handler(); |
15 | public void onCreate(Bundle savedInstanceState) { |
16 | super .onCreate(savedInstanceState); |
17 | setContentView(R.layout.theadsample1); |
20 | mTextView = (TextView)findViewById(R.id.ThreadSample1); |
22 | findViewById(R.id.ThreadSample1).setOnClickListener( this ); |
26 | public void onClick(View arg0) { |
28 | ( new Thread( new Runnable() { |
35 | * Handlerのpostメソッドを使ってUIスレッドに処理をdispatchします |
37 | mHandler.post( new Runnable() { |
41 | mTextView.setText( "Thread Samples" ); |
0 件のコメント:
コメントを投稿