`
zhy20045923
  • 浏览: 156646 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android线程模式(handler,thread,looper)

阅读更多
在 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 線程模式简介
分享到:
评论
1 楼 还有也许 2013-06-14  
貌似懂了一点。如果onCreate方法中创建了一个db,然后在子线程中进行了与服务器端的交互,接着在handle中进行数据修改,是否会报空指针呢?

相关推荐

    Handler + Thread + Looper

    在Android应用开发中,Handler、Thread和Looper是三个至关重要的组件,它们共同构成了Android线程间通信的基础架构。本文将详细解析这三个概念及其相互关系,旨在帮助开发者理解它们的工作原理和实际应用场景。 ...

    Handler+Looper+MessageQueue

    【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...

    android 更新 UI 线程 handler

    总结来说,`android 更新 UI 线程 handler`这个知识点主要涉及如何在Android中安全地更新UI。通过Handler和Runnable的配合,我们可以确保在主线程中执行UI更新操作,从而避免阻塞用户界面,提高应用的响应速度和用户...

    android 线程之间通过Handler发送消息

    为了在后台线程和主线程之间交换数据和控制流程,Android提供了Handler、Looper和Message这三者结合的机制。 1. **Handler(处理器)**:Handler是Android中的一个关键类,用于发送和处理消息。当你创建一个Handler...

    Android线程操作 handler demo

    Handler是Android中处理消息和回调的核心组件,它与Looper和Message紧密配合,实现了线程间的通信。以下是你需要了解的关键概念: 1. **主线程与工作线程**:Android应用默认有一个主线程,负责处理UI更新和用户...

    Android Thread Handler

    在Android应用开发中,线程(Thread)和Handler是实现多任务并行处理以及界面更新的关键组件。Android系统是一个单线程模型,主线程(UI线程)负责处理用户交互和绘制界面,而其他工作通常需要在后台线程中执行,以...

    Android Handler线程间的调度

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构成了Android的消息处理机制。本文将深入探讨“Android Handler线程间的调度”这一主题,并结合提供的资源——MessageProject,来...

    Android Looper使用介绍

    Android Looper 是 Android 操作系统中的一种机制,用于在单线程中创建消息循环,以便实现线程之间的通信和消息处理。Looper 对象通过 MessageQueue 来存放消息和事件,每个线程只能有一个 Looper 对象,-...

    Android线程结束——合理的结束你想结束的线程

    在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或...正确使用Thread、AsyncTask、Handler和Looper等工具,结合适当的生命周期管理,是每个Android开发者必须掌握的技能。

    Thread,Looper,Handler,Message,MessageQueue,MessagePool之间的关系

    在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...

    Android_Handler的线程队列Demo

    在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制。这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互...

    Android 中三种启用线程的方法总结

    首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...

    Handler与AsyncTask,Looper使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...

    andriod多线程通信handler方法

    为了防止UI线程被阻塞,Android引入了Handler、Looper和Message机制来实现线程间通信,尤其是主线程(UI线程)与工作线程之间的交互。"andriod多线程通信handler方法"这个主题正是关注这一核心概念。 首先,我们...

    android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

    本文将深入探讨Android中的线程模型,重点讲解Handler、Message Queue和AsyncTask,并提供修改Button样式的示例以及如何将这些概念整合到一个易用的方案中。 1. **Android线程模型** Android系统的主线程,也称为...

    androidHandler测试的demo

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...

    Android+高级开发面试题以及答案整理.pdf

    在创建 Handler 对象时,如果不在主线程中创建,而是在子线程中创建,会导致程序崩溃,提示的错误是 Can't create handler inside thread that has not called Looper.prepare()。这是因为子线程中没有调用 Looper....

    android 中Handler 的几种写法

    在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新...在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程运行机制。

    Android消息机制Handler的工作过程详解

    Handler提供一个Looper对象,因为Handler默认是与当前线程的Looper绑定的,而主线程在启动时自动创建了一个Looper,子线程默认是没有Looper的。所以,如果要在子线程中使用Handler,需要先手动创建Looper,代码如下...

Global site tag (gtag.js) - Google Analytics