AndroidのHandlerまとめ

9118 ワード

<一>Handlerの定義:
主にサブスレッドから送信データを受け取り、このデータをメインスレッドに合わせてUIを更新する.
解釈:アプリケーションが起動すると、Androidはまずメインスレッド(つまりUIスレッド)を開き、メインスレッドは管理インタフェースのUIコントロールであり、イベントの配布を行います.例えば、Buttonをクリックすると、AndroidはイベントをButtonに配布し、あなたの操作に応えます.
インターネットでデータを読み取ったり、ローカルの大きなファイルを読み取ったりするなど、時間のかかる操作が必要な場合は、これらの操作をメインスレッドに置くことはできません.メインスレッドに置くと、インタフェースに偽死現象が発生し、5秒も完成していない場合は、Androidシステムのエラーメッセージ(ANR)が「強制閉鎖」されます.この場合、サブスレッドはUIの更新に関連しているため、Androidプライマリスレッドはスレッドが安全ではありません.つまり、UIの更新はプライマリスレッドでしか更新できません.サブスレッドでの操作は危険です.このとき,Handlerはこの複雑な問題を解決するために,Handlerがメインスレッド(UIスレッド)で動作するため,サブスレッドとMessageオブジェクトを介してデータを伝達することができ,このときHandlerはサブスレッドからの伝達を受け入れる(サブスレッドはsedMessage()メソッドでMessageオブジェクトを伝達し,データを含む)ことを担う.これらのメッセージをメインスレッドキューに入れ,メインスレッドに合わせてUIを更新する.
<二>Handlerのいくつかの特徴
handlerは、MessageオブジェクトとRunnableオブジェクトをプライマリ・スレッドに配布できます.各Handlerインスタンスは、作成されたスレッドにバインドされます(一般的にはプライマリ・スレッドにあります).Handlerには、(1):メッセージMessageのスケジュールまたはRunnableがプライマリ・スレッドのどこかで実行され、(2)1つのアクションが異なるスレッドで実行される2つの役割があります.
      
1         Handler          
2         post(Runnable)        //post            ,           
3         postAtTime(Runnable,long)
4         postDelayed(Runnable long)
5         sendEmptyMessage(int)
6         sendMessage(Message)
7         sendMessageAtTime(Message,long)
8         sendMessageDelayed(Message,long)

以上の方法はpostで始まる方法で、Runnableオブジェクトをメインスレッドキューに配置し、sendで始まる方法で、データ付きMessageオブジェクトをキューに配置し、更新を待つことができます.<三>Handlerインスタンス
(1)サブクラスは、Hendlerクラスを継承し、handleMessage(Message msg)メソッドを書き換えてスレッドデータを受け入れる必要がある.以下の例では、スレッドを介してインタフェースButtonの内容を変更する機能を実現する.
 1 public class MyHandlerActivity extends Activity {
 2     Button  button;
 3     MyHandler  myHandler;          
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.handlertest);
 7         button = (Button) findViewById(R.id.button);
 8         myHandler = new MyHandler( );        //        Handler   ,                     (        ) ,      
 9    
10         MyThread m = new MyThread();     //   Runnable  
11         new Thread(m).start();       //       ,     , handler    
12     }
13     /**
14      *     ,     , Handler           
15      * */
16     class MyHandler extends Handler {
17         public MyHandler() { }
18         public MyHandler(Looper L) {  super(L); }
19 
20         //          ,       
21         @Override
22         public void handleMessage(Message msg) {
23             super.handleMessage(msg);
24             //       UI
25             Bundle b = msg.getData();
26             String color = b.getString("color");
27             MyHandlerActivity.this.button.append(color);
28         }
29     }
30     class MyThread implements Runnable {
31         public void run() {
32             try {
33                 Thread.sleep(10000);
34             } catch (InterruptedException e) {
35                 e.printStackTrace();
36             }
37             Log.d("thread.......", "mThread........");
38             Message msg = new Message();
39             Bundle b = new Bundle();//     
40             b.putString("color", "  ");
41             msg.setData(b);
42             MyHandlerActivity.this.myHandler.sendMessage(msg); //  Handler    ,  UI
43         }
44     }
45 }

例リンク:http://byandby.iteye.com/blog/832467http://byandby.iteye.com/blog/832915
(変換元:http://blog.csdn.net/jincf2011/article/details/6603918)
Android Handlerの詳細な使用方法の例
http://www.jb51.net/article/43360.htm