Handler與Looper經(jīng)常用在異步消息處理里,當然大部分時(shí)間是與線(xiàn)程集合起來(lái)進(jìn)行異步通信及處理的。
Android中的異步消息處理涉及Handler、Looper、Message和MessageQueue如下 :

1 Handler
Handler主要是消息發(fā)送和接收的處理者,負責發(fā)送Message到消息隊列,以及處理Looper分派過(guò)來(lái)的Message。
Handler類(lèi)可用于在主線(xiàn)程和工作線(xiàn)程中收發(fā)消息,Handler對象在工作線(xiàn)程中發(fā)送消息,該消息發(fā)送至消息隊列中后等待處理。
在主線(xiàn)程中,Handler從消息隊列中接收消息,并根據消息中的信息決定如何更新主線(xiàn)程中的UI。
2 Looper
Looper扮演MessageQueue和Handler之間的橋梁角色,負責消息循環(huán)和消息派發(fā),其去循環(huán)取出MessageQueue中的Message,并將取出的Message交付給相應的Handler處理。
Android應用程序是消息驅動(dòng)的,Android系統提供了消息循環(huán)機制Looper,通過(guò)Looper和Handler實(shí)現消息循環(huán)機制。
Android消息循環(huán)是針對線(xiàn)程的(每個(gè)線(xiàn)程都可以有自己的消息隊列和消息循環(huán))。在A(yíng)ndroid系統中,Looper負責管理線(xiàn)程的消息隊列(Message Queue)和消息循環(huán)。
3 MessageQueue
Message類(lèi)用于存放消息中的數據,在通信時(shí)負責相關(guān)信息的存放和傳遞,類(lèi)似于一個(gè)實(shí)體對象。
MessageQueue顧名思義就是消息隊列,它是采用單鏈表的數據結構來(lái)存儲消息列表,用來(lái)存放通過(guò)Handler發(fā)過(guò)來(lái)的Message,按照先進(jìn)先出的順序執行。
4 Handler 的一般用法
Activity 中創(chuàng )建一個(gè)Handler,然后在子線(xiàn)程中發(fā)送消息。
public class MainActivity extends AppCompatActivity {private TextView tv_text;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:// 把UI線(xiàn)程發(fā)送來(lái)的消息顯示到屏幕上tv_text.setText("what=" + msg.what + ", " + msg.obj);break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_text = findViewById(R.id.tv_text);// 在UI線(xiàn)程中開(kāi)啟一個(gè)子線(xiàn)程new Thread(new Runnable() {@Overridepublic void run() {// UI線(xiàn)程發(fā)消息Message msg = Message.obtain();msg.what = 1;msg.obj = "向UI線(xiàn)程中發(fā)送消息!";// 向子線(xiàn)程中發(fā)送消息handler.sendMessage(msg);}}).start();}}
5 Handler 的另一種用法 需要注意
子線(xiàn)程中創(chuàng )建的Handler,然后從主線(xiàn)程向子線(xiàn)程中發(fā)送消息。
public class MainActivity extends AppCompatActivity {private Handler handler;private TextView tv_text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_text = findViewById(R.id.tv_text);// 在UI線(xiàn)程中開(kāi)啟一個(gè)子線(xiàn)程new Thread(new Runnable() {@Overridepublic void run() {// 在子線(xiàn)程中初始化一個(gè)Looper對象Looper.prepare();handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:// 把UI線(xiàn)程發(fā)送來(lái)的消息顯示到屏幕上Log.i("info", "what=" + msg.what + ", " + msg.obj);break;}}};// 把剛才初始化的Looper對象運行起來(lái),循環(huán)消息隊列的消息Looper.loop();}}).start();tv_text.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// UI線(xiàn)程發(fā)消息Message msg = Message.obtain();msg.what = 1;msg.obj = "向子線(xiàn)程中發(fā)送消息!";// 向子線(xiàn)程中發(fā)送消息handler.sendMessage(msg);}});}}
聯(lián)系客服