`
yidongkaifa
  • 浏览: 4059388 次
文章分类
社区版块
存档分类
最新评论

Android开发--多线程中的Handler机制/Looper的介绍

 
阅读更多

在多线程的开发中,Handler机制如同在主线程中运行一样,只是需要注意在非主线程中Handler机制的作用限制,本文将对这些内容作出解释。

* 如果应用上一个例子的方法对UI界面进行操作,将抛出异常,为此,Android中引入了Handler消息
* 传递机制,来实现在新创建的线程中操作UI界面,下面将对Handler消息传递机制进行介绍
* 一.
* 循环者Looper简介
* 1.首先需要知道一个概念,那就是MessageQueue,在Android中,一个线程对应一个Looper对象
* ,而一个Looper对象又对应一个MessageQueue(消息队列)。MessageQueue用于存放Message,
* 在MessageQueue中,存放的消息以队列的模式执行。
* 2.Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueue。默认情况下,Android
* 中新创建的线程是没有开启消息循环的,但是主线程除外,系统自动为主线程创建Looper对象,开启消息循环。
* 所以,在主线程中,应用下面的代码创建Handler对象时,不会出错,而如果在新创建的非主线程中,应用下面
* 的代码创建Handler对象时,将产生异常信息。
* 如果想要在非主线程中,创建Handler对象,首先要使用Looper类的prepare()方法来初始化一个
* Looper对象,然后创建这个Handler对象,再使用Looper对象的loop()方法,启动Looper,从消息队列里
* 获取和处理消息。
* 3.Looper对象
* 提供了几个方法:
* prepare()----用于初始化Looper
* loop()----用于开启消息循环,当调用了loop()方法后,Looper线程就真正的开始工作了,它会从消息队列中
* 获取消息并处理消息
* quit()----用于结束Looper消息循环
*
* 注意:
* 下载loop()之后的代码不会被执行,这个函数内部是一个消息循环,除非调用quit()方法,loop()才会终止,
* 其后面的代码才能得以运行。

源代码如下:

onCreate()方法:

public class Thread_Handler_Activity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_thread__handler_);
		LooperHandler thread=new LooperHandler();
		thread.start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_thread__handler_, menu);
		return true;
	}

}

自定义线程类:

public class LooperHandler extends Thread{
	public Handler handler;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		//初始化Looper对象
		Looper.prepare();
		//实例化一个Handler对象
		handler=new Handler(){

			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				Log.d("BruceZhang", "This is Test!!!");
			}
			
		};
		Message msg=handler.obtainMessage();
		msg.what=1;
		handler.sendMessage(msg);
		Looper.loop();
	}

}

运行的结果是在日志中显示一条信息,如图所示运行结果:


但是,如果没有对Looper的声明,运行就会抛出如下的异常:


所以,在实际的应用中,应考虑Handler在哪一个线程的中的实现。

分享到:
评论

相关推荐

    android 多线程 looper handler

    android 多线程 looper handler的讲解,轻松学明白androd的消息机制,附有很多实例。

    Android中多线程的Handler原理

    Android中多线程的Handler的工作原理,其中涉及到MessageQueue和Looper。详情可以参见博客:http://www.cnblogs.com/plokmju/p/android_Looper.html

    Android_Handler,Looper,Message

    Android ,Handler,Looper,Message

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

    1.Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue...

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

    在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而...

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

    android开发艺术探索高清完整版PDF

    27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 ...

    深入Android Handler,MessageQueue与Looper关系

    一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的作用就是更新UI,这也确实没错,但除了更新UI...

    swt-async-handler-1.0

    由于,不是很了解android下的Handler机制,没有深层次的编写诸如looper,MessageQueue。 将在下一个版本中加入MessageQueue机制,实现多任务后台处理相应。 具体使用请参考test包下的Handler使用事例。

    Handler与AsyncTask使用示例

    Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    Android线程机制_2011_9_30更新

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

    [安卓开源项目]Android-炫酷的3D音乐播放器-各种特效OpenGL.zip

    毕设安卓源码,分享给需要的人。 对于现阶段的Android开发而言,技术深度很大一部分就体现在对...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米) 如何更新UI,为什么子线程不能更新UI?(美

    深入理解Android:卷I--详细书签版

     对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。  (2)Android系统开发工程师  Android系统开发工程师常常需要...

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

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

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

    Android后台线程和UI线程通讯实例

    本节向你展示如何在任务中发送数据给UI线程里的对象,这个特性允许你在后台线程工作,完了在UI线程展示结果。...用Handler(Looper)方法实例化,连接到UI线程,构造方法使用Looper对象,也是Android系统线

    Android并发开发

    第5-7章是本书的核心内容,深入探讨Android操作系统的细节,如Looper/Handler、Service、Binder、定时任务等。第8章介绍并发工具,如静态分析、注解、断言等。本书适合有Android开发经验的读者参考。如果你是一名...

Global site tag (gtag.js) - Google Analytics