在 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在主线程之内进行通信。
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 線程模式简介
分享到:
相关推荐
简单实现更新UI的操作,仅供学习参考 这里用到handler类,runnable类,按钮的点击事件
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
4.线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue。 每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收...
Android中的主线程由 looper 和 Handlers 组成。所以了解创建无阻碍的响应式 UI 很重要。 MessageQueue 是一个队列,其中包含消息任务。 Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们...
Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
在你的Android程序里,新诞生一个线程,或称执行(Thread)时,并不会自动建立其Message Loop。 Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message...
在android开发中,一说起线程的使用,很多人马上想到new Thread(){…}.start()这种方式。这样使用当然可以,但是多次使用这种方式,会创建多个匿名线程。使得程序运行起来越来越慢。因此,可以考虑使用一个Handler来...
,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...
Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,...
根据开发经验以及android机制,结合Java多线程和android多线程,说明问题。 给初学android或者对android的多线程机制还有点迷惑的人做点贡献。该文档会持续更新。 推荐:...
2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue...
可以在子线程直接new一个Handler,不过需要在子线程里先调用Looper.prepare(),new一个Handler后,还需要调用Looper.loop()方法。 new Thread(new Runnable() { @Override public void run() { Looper.prepare()...
5. Android中的动画有哪几类,它们的特点和区别是什么? 两种.一种是Tween动画.还有一种是Frame动画. Tween动画,这种实现方式...4)线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue.
UI thread 通常就是main thread,而Android启动程序时(即诞生Process时)会替它建立一个Message Queue。 当然需要一个Looper之对象,来管理该Message Queue。 我们可以诞生Handler之对象来push新讯息到...
说到线程就要说说线程机制 Handler,Looper,MessageQueue 可以说是三座大山了 Handler Handler 其实就是一个处理者,或者说一个发送者,它会把消息发送给消息队列,也就是Looper,然后在一个无限循环队列中进行取出...
2)多线程实现方式implements Runnable 或 extends Thread 3)多线程核心机制是Handler 4)提供如下几种实现方式 —-1—–Handler ————————————说明1 创建一个Handler时一定要关联一个Looper实例,默认...
Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper)。Android中除了UI线程(主线程),创建的工作线程默认是没有...
2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 ...