在 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 線程模式简介
分享到:
相关推荐
在Android应用开发中,Handler、Thread和Looper是三个至关重要的组件,它们共同构成了Android线程间通信的基础架构。本文将详细解析这三个概念及其相互关系,旨在帮助开发者理解它们的工作原理和实际应用场景。 ...
【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...
总结来说,`android 更新 UI 线程 handler`这个知识点主要涉及如何在Android中安全地更新UI。通过Handler和Runnable的配合,我们可以确保在主线程中执行UI更新操作,从而避免阻塞用户界面,提高应用的响应速度和用户...
为了在后台线程和主线程之间交换数据和控制流程,Android提供了Handler、Looper和Message这三者结合的机制。 1. **Handler(处理器)**:Handler是Android中的一个关键类,用于发送和处理消息。当你创建一个Handler...
Handler是Android中处理消息和回调的核心组件,它与Looper和Message紧密配合,实现了线程间的通信。以下是你需要了解的关键概念: 1. **主线程与工作线程**:Android应用默认有一个主线程,负责处理UI更新和用户...
在Android应用开发中,线程(Thread)和Handler是实现多任务并行处理以及界面更新的关键组件。Android系统是一个单线程模型,主线程(UI线程)负责处理用户交互和绘制界面,而其他工作通常需要在后台线程中执行,以...
在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构成了Android的消息处理机制。本文将深入探讨“Android Handler线程间的调度”这一主题,并结合提供的资源——MessageProject,来...
Android Looper 是 Android 操作系统中的一种机制,用于在单线程中创建消息循环,以便实现线程之间的通信和消息处理。Looper 对象通过 MessageQueue 来存放消息和事件,每个线程只能有一个 Looper 对象,-...
在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或...正确使用Thread、AsyncTask、Handler和Looper等工具,结合适当的生命周期管理,是每个Android开发者必须掌握的技能。
在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制。这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互...
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...
为了防止UI线程被阻塞,Android引入了Handler、Looper和Message机制来实现线程间通信,尤其是主线程(UI线程)与工作线程之间的交互。"andriod多线程通信handler方法"这个主题正是关注这一核心概念。 首先,我们...
本文将深入探讨Android中的线程模型,重点讲解Handler、Message Queue和AsyncTask,并提供修改Button样式的示例以及如何将这些概念整合到一个易用的方案中。 1. **Android线程模型** Android系统的主线程,也称为...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...
在创建 Handler 对象时,如果不在主线程中创建,而是在子线程中创建,会导致程序崩溃,提示的错误是 Can't create handler inside thread that has not called Looper.prepare()。这是因为子线程中没有调用 Looper....
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新...在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程运行机制。
Handler提供一个Looper对象,因为Handler默认是与当前线程的Looper绑定的,而主线程在启动时自动创建了一个Looper,子线程默认是没有Looper的。所以,如果要在子线程中使用Handler,需要先手动创建Looper,代码如下...