Android线程模式(handler,thread,looper)
程序员文章站
2022-05-16 08:41:37
...
在 Android 框架裡,一個應用套件(Application Package)通常含有多個Java 類(Class),這些類可以在同一個進程(Process)裡執行;也可以在不同的進程裡執行。
每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper類的對象和一個MQ(Message Queue)資料結構。每當主線程作完事情,就會去執行Looper類。此時,不斷地觀察MQ的動態。
主線程最主要的工作就是處理UI畫面的事件(Event),每當UI事件發生時,Android框架會丟信息(Message)到MQ裡。主線程看到MQ有新的信息時,就取出信息,然後依據信息內容而去執行特定的函數。執行完畢,就再繼續執行Looper類,不斷地觀察MQ的動態。
本文章通过3个例子来说明子线程和主线程之间的通信。
一:通过handler在主线程之内进行通信。
Obj值为"myLooper == MainLooper",因为该线程属于主线程,所以获取的当前线程的Looper对象和主线程的Looper对象时同一个。
二:子线程发送message通知主线程更新UI操作
Obj值为myLooper is null,因为每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper類的對象和一個MQ(Message Queue)資料結構。而子线程不会自动创建,除非自己创建,创建过程看例子三。
三:子线程和主线程之间交互
为子线程创建自己的Looper对象过程如下:
Looper.prepare();
自己的操作
Looper.loop();
HandlerThread .
这个类可以简化Thread,因为它里面定义了looper变量
测试代码见附件
以上文章参考高焕堂Android系统架构详细讲解-Android 線程模式简介
每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper類的對象和一個MQ(Message Queue)資料結構。每當主線程作完事情,就會去執行Looper類。此時,不斷地觀察MQ的動態。
主線程最主要的工作就是處理UI畫面的事件(Event),每當UI事件發生時,Android框架會丟信息(Message)到MQ裡。主線程看到MQ有新的信息時,就取出信息,然後依據信息內容而去執行特定的函數。執行完畢,就再繼續執行Looper類,不斷地觀察MQ的動態。
本文章通过3个例子来说明子线程和主线程之间的通信。
一:通过handler在主线程之内进行通信。
mBtn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Looper myL = Looper.myLooper(); Looper mainL = Looper.getMainLooper(); String obj = ""; mH = new MyHandler(mainL); if(myL == mainL) { obj = "myLooper == MainLooper"; } else { obj = "myLooper != MainLooper"; } Message msg = mH.obtainMessage(1, obj); mH.sendMessage(msg); } });
Obj值为"myLooper == MainLooper",因为该线程属于主线程,所以获取的当前线程的Looper对象和主线程的Looper对象时同一个。
二:子线程发送message通知主线程更新UI操作
mBtn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mT = new MyThread(); mT.start(); } }); public void run() { Looper myL = Looper.myLooper(); Looper mainL = Looper.getMainLooper(); String obj = ""; mH = new MyHandler(mainL); if(myL == null) { obj = "myLooper is null"; } else if(myL == mainL){ obj = "myLooper == MainLooper"; } else { obj = "myLooper != MainLooper"; } Message msg = mH.obtainMessage(1, obj); mH.sendMessage(msg); }
Obj值为myLooper is null,因为每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper類的對象和一個MQ(Message Queue)資料結構。而子线程不会自动创建,除非自己创建,创建过程看例子三。
三:子线程和主线程之间交互
mBtn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String obj = "main thread"; Message msg = mH.obtainMessage(1, obj); mH.sendMessage(msg); } }); public void run() { Looper.prepare(); mH = new Handler(){ @Override public void handleMessage(Message msg) { Log.e("XXX", msg.obj.toString()); Looper myL = Looper.myLooper(); Looper mainL = Looper.getMainLooper(); String obj = ""; mH = new MyHandler(mainL); if(myL == mainL){ obj = "myLooper == MainLooper"; } else { obj = "myLooper != MainLooper"; } Message msg1 = mH.obtainMessage(1, obj); mH.sendMessage(msg1); } }; Looper.loop(); }
为子线程创建自己的Looper对象过程如下:
Looper.prepare();
自己的操作
Looper.loop();
HandlerThread .
这个类可以简化Thread,因为它里面定义了looper变量
测试代码见附件
以上文章参考高焕堂Android系统架构详细讲解-Android 線程模式简介
推荐阅读
-
Android开发笔记之:Handler Runnable与Thread的区别详解
-
Android开发笔记之:如何安全中止一个自定义线程Thread的方法
-
Android多线程处理机制中的Handler使用介绍
-
android的消息处理机制(图文+源码分析)—Looper/Handler/Message
-
Android Handler主线程和一般线程通信的应用分析
-
android线程消息机制之Handler详解
-
Handler与Android多线程详解
-
深入Android Handler与线程间通信ITC的详解
-
Android开发笔记之:如何安全中止一个自定义线程Thread的方法
-
android使用handler ui线程和子线程通讯更新ui示例