Androidでは、マルチスレッド化の方法として、以下のいづれかを選択することができます。
      - Java標準Threadクラスを使う
- Androidで提供されているAsyncTaskを使う
その1では、1番のJava標準Threadクラスを使った例を説明します。
まず、Activity起動直後にプログレスダイアログを表示し、バックグランド処理用のThreadを起動するコードを見てみましょう。
  (動作しない不完全コード例)
                      | 1 | packagecom.team_hiroq.sample; | 
                     | 3 | importandroid.app.Activity; | 
                   | 4 | importandroid.os.Bundle; | 
                   | 5 | importandroid.view.View; | 
                   | 6 | importandroid.view.View.OnClickListener; | 
                   | 7 | importandroid.widget.TextView; | 
                     | 9 | publicclassThreadSample1 extendsActivity implementsOnClickListener{ | 
                         | 13 |     publicvoidonCreate(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 |     publicvoidonClick(View arg0) { | 
                     | 26 |         (newThread(newRunnable() { | 
                               | 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 | packagecom.team_hiroq.sample; | 
                     | 3 | importandroid.app.Activity; | 
                   | 4 | importandroid.os.Bundle; | 
                   | 5 | importandroid.os.Handler; | 
                   | 6 | importandroid.view.View; | 
                   | 7 | importandroid.view.View.OnClickListener; | 
                   | 8 | importandroid.widget.TextView; | 
                     | 10 | publicclassThreadSample1 extendsActivity implementsOnClickListener{ | 
                   | 11 |     Handler  mHandler   = newHandler();         | 
                         | 15 |     publicvoidonCreate(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 |     publicvoidonClick(View arg0) { | 
                     | 28 |         (newThread(newRunnable() { | 
                               | 35 |                  *     Handlerのpostメソッドを使ってUIスレッドに処理をdispatchします | 
                     | 37 |                 mHandler.post(newRunnable() { | 
                         | 41 |                         mTextView.setText("Thread Samples"); | 
               
 
0 件のコメント:
コメントを投稿