`
zhy20045923
  • 浏览: 153694 次
  • 性别: 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中进行数据修改,是否会报空指针呢?

相关推荐

    android 更新 UI 线程 handler

    简单实现更新UI的操作,仅供学习参考 这里用到handler类,runnable类,按钮的点击事件

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

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

    android+多线程机制的讲解和例子

    4.线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue。 每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收...

    了解Android核心:Looper,Handler和HandlerThread

    Android中的主线程由 looper 和 Handlers 组成。所以了解创建无阻碍的响应式 UI 很重要。 MessageQueue 是一个队列,其中包含消息任务。 Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们...

    Android的线程使用来更新UI

    Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

    活用Android的Message Queue

     在你的Android程序里,新诞生一个线程,或称执行(Thread)时,并不会自动建立其Message Loop。  Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message...

    android使用handlerthread创建线程示例

    在android开发中,一说起线程的使用,很多人马上想到new Thread(){…}.start()这种方式。这样使用当然可以,但是多次使用这种方式,会创建多个匿名线程。使得程序运行起来越来越慢。因此,可以考虑使用一个Handler来...

    Thread、Handler和HandlerThread关系详解

    ,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...

    全面总结Android中线程的异步处理方式

    Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,...

    Android线程机制_2011_9_30更新

    根据开发经验以及android机制,结合Java多线程和android多线程,说明问题。 给初学android或者对android的多线程机制还有点迷惑的人做点贡献。该文档会持续更新。 推荐:...

    Android App在线程中创建handler的方法讲解

    2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue...

    【面试】可以在子线程直接new一个Handler吗?怎么做?

    可以在子线程直接new一个Handler,不过需要在子线程里先调用Looper.prepare(),new一个Handler后,还需要调用Looper.loop()方法。 new Thread(new Runnable() { @Override public void run() { Looper.prepare()...

    Android 面试宝典

    5. Android中的动画有哪几类,它们的特点和区别是什么? 两种.一种是Tween动画.还有一种是Frame动画. Tween动画,这种实现方式...4)线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue.

    活用Android的Message_Queue(2)

     UI thread 通常就是main thread,而Android启动程序时(即诞生Process时)会替它建立一个Message Queue。  当然需要一个Looper之对象,来管理该Message Queue。  我们可以诞生Handler之对象来push新讯息到...

    浅谈Android中线程池的管理

    说到线程就要说说线程机制 Handler,Looper,MessageQueue 可以说是三座大山了 Handler Handler 其实就是一个处理者,或者说一个发送者,它会把消息发送给消息队列,也就是Looper,然后在一个无限循环队列中进行取出...

    Android多线程及异步处理问题详细探讨

    2)多线程实现方式implements Runnable 或 extends Thread 3)多线程核心机制是Handler 4)提供如下几种实现方式 —-1—–Handler ————————————说明1 创建一个Handler时一定要关联一个Looper实例,默认...

    Android 消息队列模型详解及实例

    Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper)。Android中除了UI线程(主线程),创建的工作线程默认是没有...

    Android开发艺术探索

    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 ...

Global site tag (gtag.js) - Google Analytics