Android開発におけるHandlerの定番まとめ
アプリケーションが起動すると、Androidはまずメインスレッド(すなわちUIスレッド)を開き、メインスレッドは管理インタフェースのUIコントロールであり、イベント配信を行う.
一、Handlerの定義:
主にサブスレッドから送信されたデータを受け取り、このデータをメインスレッドと合わせてUIを更新します.
解釈:アプリケーションが起動すると、Androidはまずメインスレッド(つまりUIスレッド)を開きます.メインスレッドは管理インタフェースのUIコントロールであり、イベントの配布を行います.例えば、Buttonをクリックすると、AndroidはイベントをButtonに配布し、操作に応答します. ネットワークでデータを読み込むなど、時間のかかる操作が必要な場合は、 あるいはローカルの大きなファイルを読み取るときは、これらの操作をメインスレッドに置くことはできません.メインスレッドに置くと、インタフェースに偽死現象が発生し、5秒も完成していないとAndroidシステムのエラーメッセージが表示されます. 強制的に閉じる この場合、サブスレッドはUI更新に関連するため、Androidプライマリスレッドはスレッドが安全ではありません.つまり、UIの更新はプライマリスレッドでしか更新できません.サブスレッドでの操作は危険です.この時、Handlerが現れました.、この複雑な問題を解決するために、Handlerはメインスレッド(UIスレッド)で実行されるため、 サブスレッドとはMessageオブジェクトを介してデータを伝達することができ,このときHandlerはサブスレッドからの伝達を受け入れる(サブスレッドはsedMessage()メソッドで弟を伝達する)Messageオブジェクト(データを含む)を担う. , これらのメッセージをメインスレッドキューに入れ,メインスレッドに合わせてUIを更新する.
二、Handlerのいくつかの特徴
handlerはMessageオブジェクトとRunnableオブジェクトをプライマリ・スレッドに配布できます.各Handlerインスタンスは、作成したスレッド(通常はプライマリ・スレッド)にバインドされます.これには2つの役割があります.
(1)メッセージまたはRunnableをあるメインスレッドのある場所で実行するように手配する.
(2)動作を異なるスレッドで実行するように手配する.
Handlerでメッセージを配信する方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上のpostクラスメソッドでは、Runnableオブジェクトをプライマリ・スレッド・キューに配置できます.
sendMessageクラスメソッドでは、データ付きMessageオブジェクトをキューに配置し、更新を待つことができます.
三、Handlerの例
サブクラスは、Hendlerクラスを継承し、スレッドデータを受け入れるためにhandleMessage(Message msg)メソッドを書き換える必要があります.
スレッドによってインタフェースButtonの内容を変更する機能を実装する例を次に示します.
転載先:クリックしてリンクを開く
一、Handlerの定義:
主にサブスレッドから送信されたデータを受け取り、このデータをメインスレッドと合わせてUIを更新します.
解釈:アプリケーションが起動すると、Androidはまずメインスレッド(つまりUIスレッド)を開きます.メインスレッドは管理インタフェースのUIコントロールであり、イベントの配布を行います.例えば、Buttonをクリックすると、AndroidはイベントをButtonに配布し、操作に応答します. ネットワークでデータを読み込むなど、時間のかかる操作が必要な場合は、 あるいはローカルの大きなファイルを読み取るときは、これらの操作をメインスレッドに置くことはできません.メインスレッドに置くと、インタフェースに偽死現象が発生し、5秒も完成していないとAndroidシステムのエラーメッセージが表示されます. 強制的に閉じる この場合、サブスレッドはUI更新に関連するため、Androidプライマリスレッドはスレッドが安全ではありません.つまり、UIの更新はプライマリスレッドでしか更新できません.サブスレッドでの操作は危険です.この時、Handlerが現れました.、この複雑な問題を解決するために、Handlerはメインスレッド(UIスレッド)で実行されるため、 サブスレッドとはMessageオブジェクトを介してデータを伝達することができ,このときHandlerはサブスレッドからの伝達を受け入れる(サブスレッドはsedMessage()メソッドで弟を伝達する)Messageオブジェクト(データを含む)を担う. , これらのメッセージをメインスレッドキューに入れ,メインスレッドに合わせてUIを更新する.
二、Handlerのいくつかの特徴
handlerはMessageオブジェクトとRunnableオブジェクトをプライマリ・スレッドに配布できます.各Handlerインスタンスは、作成したスレッド(通常はプライマリ・スレッド)にバインドされます.これには2つの役割があります.
(1)メッセージまたはRunnableをあるメインスレッドのある場所で実行するように手配する.
(2)動作を異なるスレッドで実行するように手配する.
Handlerでメッセージを配信する方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上のpostクラスメソッドでは、Runnableオブジェクトをプライマリ・スレッド・キューに配置できます.
sendMessageクラスメソッドでは、データ付きMessageオブジェクトをキューに配置し、更新を待つことができます.
三、Handlerの例
サブクラスは、Hendlerクラスを継承し、スレッドデータを受け入れるためにhandleMessage(Message msg)メソッドを書き換える必要があります.
スレッドによってインタフェースButtonの内容を変更する機能を実装する例を次に示します.
public class MyHandlerActivity extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super。onCreate(savedInstanceState);
setContentView(R。layout。handlertest);
button = (Button) findViewById(R。id。button);
myHandler = new MyHandler();
// Handler , ,
// Handler , (1) : Message Runnalbe
// (2): , 。
// ,
// post(Runnable)
// postAtTime(Runnable,long)
// postDelayed(Runnable,long)
// sendEmptyMessage(int)
// sendMessage(Message);
// sendMessageAtTime(Message,long)
// sendMessageDelayed(Message,long)
// post Runnable
//sendMessage() Message (Message ,)
MyThread m = new MyThread();
new Thread(m)。start();
}
/**
* , , Handler
* */
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// ,
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log。d("MyHandler", "handleMessage。。。。。。");
super。handleMessage(msg);
// UI
Bundle b = msg。getData();
String color = b。getString("color");
MyHandlerActivity。this。button。append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {
Thread。sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e。printStackTrace();
}
Log。d("thread。。。。。。。", "mThread。。。。。。。。");
Message msg = new Message();
Bundle b = new Bundle();//
b。putString("color", " ");
msg。setData(b);
MyHandlerActivity。this。myHandler。sendMessage(msg); // Handler , UI
}
}
}
転載先:クリックしてリンクを開く