1、總體工程圖java
2、activity_handler.xmlandroid
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:text="Handler Lab1" android:id="@+id/buttonHandlerLab1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab2" android:id="@+id/buttonHandlerLab2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab3" android:id="@+id/buttonHandlerLab3" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab4.1" android:id="@+id/buttonHandlerLab4_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab4.2" android:id="@+id/buttonHandlerLab4_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab5.1" android:id="@+id/buttonHandlerLab5_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> <Button android:text="Handler Lab5.2" android:id="@+id/buttonHandlerLab5_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> </LinearLayout>
3、HandlerActivity.javaapp
package com.jltxgcy.handlerdemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; import android.os.Process; public class HandlerActivity extends Activity { private static final String TAG="jltxgcy"; private final String HANDLER_KEY = "jltxgcy" ; private Handler lab1Handler1 ; private Handler lab1Handler2 ; private Handler lab2Handler ; private Handler lab3Handler; private Handler lab4Handler; private Handler lab5_1Handler = new Handler(); private Handler lab5_2Handler; private Looper mLooper; private String result; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_handler); lab1Handler2 = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Toast.makeText(HandlerActivity.this, "[Main Thread]Handler2 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ; } } ; lab1Handler1 = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); result=msg.getData().getString(HANDLER_KEY); Toast.makeText(HandlerActivity.this, "[Main Thread]Handler1 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ; } } ; //Handler Lab1 findViewById(R.id.buttonHandlerLab1).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { new Thread(new Runnable(){ @Override public void run() { lab1Handler1.sendMessage(defineNewMessage("Lab1")) ; //try to use mainHanlder2 to send meesage and receive . //mainHandler2.sendMessage(defineNewMessage("Lab1")) ; } }).start(); } }) ; findViewById(R.id.buttonHandlerLab2).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable(){ @Override public void run() { lab2Handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Log.d(TAG, "Get the message: "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ; } }; lab2Handler.sendMessage(defineNewMessage("Lab2")) ; lab3Handler.sendMessage(defineNewMessage("Lab3")) ; } }).start() ; } }); findViewById(R.id.buttonHandlerLab3).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub Looper.prepare(); lab3Handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Log.d(TAG, "Get the message from "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ; } } ; Looper.loop(); } }).start() ; } }); findViewById(R.id.buttonHandlerLab4_1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); // Get the HandlerThread's Looper and use it for our Handler mLooper = thread.getLooper(); lab4Handler = new Handler(mLooper){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Log.d(TAG, "Start message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ; try { Thread.sleep(5*1000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "Finish message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler"); } }; lab4Handler.sendMessage(defineNewMessage("Lab4.1")) ; lab4Handler.sendMessage(defineNewMessage("Lab4.2")) ; } }); findViewById(R.id.buttonHandlerLab4_2).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { lab4Handler.removeMessages(1); } }); findViewById(R.id.buttonHandlerLab5_1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { lab5_1Handler.postDelayed(new MyRunnable(), 2000); Log.d(TAG, ""+Thread.currentThread().getId()); } }); findViewById(R.id.buttonHandlerLab5_2).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { HandlerThread handlerThread = new HandlerThread("myHandlerThread"); handlerThread.start(); lab5_2Handler = new Handler(handlerThread.getLooper()); lab5_2Handler.post(new MyRunnable()); Log.d(TAG,""+Thread.currentThread().getId()); } }); } private class MyRunnable implements Runnable { public void run() { Log.d(TAG, "Runnable---The Thread is running"); Log.d(TAG, ""+Thread.currentThread().getId()); } } private Message defineNewMessage(String messageContent) { Message returnMsg = new Message() ; Bundle data = new Bundle() ; data.putString(HANDLER_KEY, messageContent) ; returnMsg.setData(data) ; returnMsg.what=1; return returnMsg ; } }
4、解析ide
Handler Lab1,接受消息的Handler在主線程中定義,並且處理消息也在主線程中。發送消息在子線程中。oop
Handler Lab2,接受消息的Handler在子線程中定義,而處理消息卻在主線程中。發送消息在子線程中。post
Handler Lab3,接受消息的Handler在子線程中定義,並且處理消息也在子線程中。發送消息在主線程中。this
Hander Lab4_1,接受消息的Handler在主線程中定義,而處理消息卻在子線程中。發送消息在主線程中。spa
Hander Lab4_2,連續發送兩條信息,結果以下,說明是一條信息結束後,才處理另外一個信息。線程
若是在發送第一個消息沒有Finish前,按下Hander Lab4_2,那麼第一個消息不會取消,第二個消息會取消。code
Hander Lab5_1,延遲2秒鐘,開啓run中的方法。結果顯示以下,說明沒有開啓新的線程。
Hander Lab5_2,結果顯示以下,這回開啓了新的線程。
一、Hander子線程用於每隔多長時間,或者完成一項任務向主線程發送消息,主線程接受消息後,更新UI。
二、Hander主線程負責向子線程發送消息,子線程接受消息後開始下載。
三、postDelay用於好比鬧鐘要隔幾分鐘後啓動。
5、Message
獲取Message的兩種方式,第一種比較易讀,第二種比較簡潔。
一、Message msg =new Message(); msg.arg1=x; msg.arg2=x; msg.obj=x; msg.replyTo=x; msg.what=x; msg.setData(Bundle bundle); 二、Message msg =Handler.obtain(Handler h, int what, int arg1, int arg2, Object obj); msg.replyTo=x; msg.setData(Bundle bundle);