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つの役割があります.
以上の方法はpostで始まる方法で、Runnableオブジェクトをメインスレッドキューに配置し、sendで始まる方法で、データ付きMessageオブジェクトをキューに配置し、更新を待つことができます.<三>Handlerインスタンス
(1)サブクラスは、Hendlerクラスを継承し、handleMessage(Message msg)メソッドを書き換えてスレッドデータを受け入れる必要がある.以下の例では、スレッドを介してインタフェースButtonの内容を変更する機能を実現する.
例リンク: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
主にサブスレッドから送信データを受け取り、このデータをメインスレッドに合わせて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