Android Handler使用
7568 ワード
一、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インスタンスは、作成されたスレッド(一般的にプライマリスレッドにある)にバインドされ、(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インスタンス(1)サブクラスは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
}
}
}