`

android Handler

 
阅读更多

Handler概述
   Android启动后会建立一个主线程(UI线程),主线程主管UI控件和事件的分发。如果一个比较耗时的操作在主线程中处理会造成UI阻塞,此时我们
       应将耗时或消耗资源的操作放在子线程中进行。子线程通常要操作UI,而UI线程是不安全的只能在主线程中进行,所以子线程应将Message传
       递到主线程中,在主线程中完成UI更新。Handler的线程间通信功能理想的选择。
    Handler只能接受自身实例所发送的Message。
Handler的作用
    执行计划任务。例如模拟定时器
    线程间通信。当Android程序启动时会创建一个主线程(UI线程),主线程会默认建立消息队列来处理各种消息(子线程不会默认),当在子线程中得
         到主线程的Handler实例时,就可以call Handler的sendMessage()方法向主线程发送消息,完成子线程向主线程的单向通信。Handler的本质
         是解决线程间通信问题,所以通过Handler以及Handler管理下的Looper、Message、MessageQueue对象方法可实现线程间消息的互传递。
    分发Message对象或者Runable对象到其他线程
    安排一个动作道不同的线程执行
Handler的实现原理

 

    //Handler
	     //实现了Handler.Callback接口,重写了handlerMessage()方法。
		 new Handler(); new Handler(Looper looper);
		 boolean post(Runable r);将r线程中的消息发送到目标消息队列中
		 boolean sendMessage(Message msg);
		 Message obainMessage();
		 Message obainMessage(int what);
		 Looper getLooper();
		 String getMessageName(Message msg);
    //Message 消息体含有发送者Handler的what标记,所以handler只能接收自己所发送的消息
	        new Message();
		void setData(Bundle bundle); 
		Bundle getData();  
		static Message obain();  
		static Message obain(Handler h);
     //Bundle
	       new Bundle();
		void putType("key",Type value); 
		Type getType("key");
     //MessageQueue 由系统实现,用以维护消息的机制,开发人员是不用考虑MessageQueue的。 
     //Looper
	    static void prepare();//为当前线程初始化一个Looper
	    static void loop();//启动Looper
            static Looper getMainLooper() ;//获取主线程Looper
	    void quit();
	    static Looper myLooper();获得当前线程相关的Looper
	    Thread getThread();获得与Looper相关的线程
   //HandlerThread
      // 继承自Thread,为开启的线程创建默认的MessageQueue,是拥有Looper特性的线程,
       new HandlerThread(Stirng name);  new HandlerThread(String name,int priority);//priority线程优先权
	   Looper getLooper();   
	   void onLooperPrepared();
 

Handler与线程间的关系
Handler是多线程的应用吗?
   是的
Handler消息队列的实现
Handler是异步的,它会建立线程吗?
    Handler是由vm控制的系统底层的实现,或许是由底层线程维护,但并没有在我们的应用层建立新的线程  
Handler是在主线程内吗?
    不一定,看你创建Handler的位置。
Handler的post(Runable thread)和sendMessage(Message msg)方法使用的是一个队列吗?
    是的。post() Method 其实质是调用传入的线程的消息发送Method。
在子线程中建立一个Handler,然后call sendMessage()方法会怎样?
    子线程默认是没有消息队列的,在子线程中实例化Handler并call sendMessage()方法会throw exception,所以在子线程中要实例化Looper,
    并call loop方法来启动looper监听消息。
在子线程中建立Handler,构造时传入主线程的Looper可以吗?
    可以。
Handler的应用:handler的应用应抓一个解释两点本质 
    解释:当某线程中的Looper监听到某线程的Handler发送的Message时,就会触发该Handler的handleMessage()
          method.
    本质:1、获取某一线程Handler对象   2、获取某一线程Looper对象并启动Looper
    子线程中获取主线程中创建的Handler,并操作主线程MessageQueue,向主线程发送消息。主线程中创建的Handler默认绑定到主线程中的Looper。

	    //创建Handler子类
		 class MyThreadHandler extends Handler
		 {
		     public void handleMessage(Message msg)
			 {
			    super.handleMessage(Message msg);
			    //your code here;
			 }
		 }
		 
		 //消息体生成方法
			 provite Message defineMessage(String msgString)
			 {
			    Message msg=new Message();
				Bundle bundle=new Bundle();
				bundle.putString("MSG",msgString);
				msg.setData(bundle);
				return msg;
			 }
		 }
	     
		 //创建Activity
		 public class MyActivity extends Activity
		 {
		     Button button=null;
			 MyThreadHandler handler=null;
			 protected void onCreate(Bundle saveInstanceState)
			 {
			    super.onCreate(savaInstanceState);
				setContentView(R.layout.myLayout);
				
				handler=new MyThreadHandler();
				button1=(Button)findViewById(R.id.button);
				button1.setOnClickListener(new OnClickListener(
				    public void onClick(View v)
					  {
					    //新建线程,发送消息
					     new Thread(new Runable(){
						    public void run()
							{
							   handler.sendMessage(defineMessage("我的消息"));
							}
						    
						 }).start();
					  }
				));
			 } 

 

    在子线程中创建Handler,并通过Looper.getMainLooper()传入主线程的Looper,向主线程的Looper发送Message。

	    //创建Handler子类
		 class MyThreadHandler extends Handler
		 {
		     public void handleMessage(Message msg)
			 {
			    super.handleMessage(Message msg);
			    //your code here;
			 }
		 }
	     
		  //消息体生成方法
			 provite Message defineMessage(String msgString)
			 {
			    Message msg=new Message();
				Bundle bundle=new Bundle();
				bundle.putString("MSG",msgString);
				msg.setData(bundle);
				return msg;
			 }
		 }
		 
		 //创建Activity
		 public class MyActivity extends Activity
		 {
		     Button button=null;		
			 protected void onCreate(Bundle saveInstanceState)
			 {
			    super.onCreate(savaInstanceState);
				setContentView(R.layout.myLayout);
				button=(Button)findViewById(R.id.button);
				button.setOnClickListener(new OnClickListener(
				    public void onClick(View v)
					  {
					   //新建线程,发送消息					   
					     new Thread(new Runable(){
						   //在子线程中创建Handler
						   public void run()
						   {
						       ThreadHandler handler=new MyThreadHandler(Looper.getMainLooper());
						       handler.sendMessage(defineMessage("我的消息"));
						   }						    
						 }).start();
					  }
				));
			 }
	

    通过HandlerThread创建带有默认Looper的子线程

	    //创建Handler子类
		 class MyThreadHandler extends Handler
		 {
		     public void handleMessage(Message msg)
			 {
			    super.handleMessage(Message msg);
			    //your code here;
			 }
		 }
	     
		  //消息体生成方法
			 provite Message defineMessage(String msgString)
			 {
			    Message msg=new Message();
				Bundle bundle=new Bundle();
				bundle.putString("MSG",msgString);
				msg.setData(bundle);
				return msg;
			 }
		 }
		 
		 //创建HandlerThread子类
		 public MyHandlerThread extends HandlerThread()
		 {
		     public MyHandlerThread(String name)
			 {super.(name);}
			 
			 public void run()
			 {
			     Looper looper=this.getLooper();
			     MyHandler handler=new MyHandler(looper);
				 handler.sendMessage("MSG","我的消息");
			 }
		 }
		 
		 //创建Activity
		 public class MyActivity extends Activity
		 {
		     Button button=null;		
			 protected void onCreate(Bundle saveInstanceState)
			 {
			    super.onCreate(savaInstanceState);
				setContentView(R.layout.myLayout);
				button=(Button)findViewById(R.id.button);
				button.setOnClickListener(new OnClickListener(
				    public void onClick(View v)
					  {
					   //新建线程,发送消息					   
					     new MyHandlerThread(String myHandlerThread).start();
					  }
				));
			 }

     在子线程中创建Handler和Looper,发送消息自接收

	    //创建Handler子类
		 class MyThreadHandler extends Handler
		 {
		     public void handleMessage(Message msg)
			 {
			    super.handleMessage(Message msg);
			    //your code here;
			 }
		 }
	     
		  //消息体生成方法
			 provite Message defineMessage(String msgString)
			 {
			    Message msg=new Message();
				Bundle bundle=new Bundle();
				bundle.putString("MSG",msgString);
				msg.setData(bundle);
				return msg;
			 }
		 }
		 
		 //创建Activity
		 public class MyActivity extends Activity
		 {
		     Button button=null;		
			 protected void onCreate(Bundle saveInstanceState)
			 {
			    super.onCreate(savaInstanceState);
				setContentView(R.layout.myLayout);
				button=(Button)findViewById(R.id.button);
				button.setOnClickListener(new OnClickListener(
				    public void onClick(View v)
					  {
					   //新建线程,发送消息					   
					     new Thread(new Runable(){
						   //在子线程中创建Handler
						   public void run()
						   {
						       Looper.prepare();//为当前线程初始化Looper
						       ThreadHandler handler=new MyThreadHandler();
						       handler.sendMessage(defineMessage("我的消息"));
							   Looper.loop();//启动Looper监听方法
						   }						    
						 }).start();
					  }
				));
			 }
 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    模拟Android Handler机制Demo

    【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...

    Android Handler传值的demo

    在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...

    androidHandler测试的demo

    在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    老罗android Handler综合练习 图文混排 服务器端源代码

    【标题】"老罗android Handler综合练习 图文混排 服务器端源代码"涉及的是Android应用开发中的关键知识点,主要集中在Handler机制、图文混排以及服务器端的数据交互。Handler是Android系统中用于线程间通信的重要...

    Android Handler模拟进度条更新

    由于Android的单线程模型,直接在后台线程更新UI是不允许的,这时就需要用到Handler、Looper和Message机制来实现跨线程通信,特别是用于模拟进度条更新,让用户体验更加友好。本篇文章将深入探讨如何使用Android ...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android Handler解析

    # Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。通常来说,将耗时的任务(如网络请求、复杂计算等)放到后台线程执行可以提高UI...

    android handler的一些测试

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程之间的交互。标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境...

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Android Handler运行原理

    ### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...

    Android Handler机制的工作原理详析

    Android Handler机制的工作原理详析 Android Handler机制是Android系统中的一种消息机制,负责处理应用程序中的消息处理和线程之间的通信。Handler机制的工作原理可以分为以下几个部分:Looper、MessageQueue、...

    Android handler message奇怪用法详解

    Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...

    Android Handler 原理分析及实例代码

    在Android开发中,`Handler` 是一个至关重要的组件,它涉及到多线程、UI更新以及消息传递机制。本文将深入探讨 `Handler` 的工作原理,分析其如何在不同线程间进行通信,并通过实例代码来展示其具体用法。 ### ...

    android handler 机制 源码

    在Android系统中,Handler、Looper和Message构成了一个用于线程间通信的重要机制。这个机制使得UI线程可以处理来自其他线程的消息,从而避免了直接在非UI线程操作UI组件,防止应用出现ANR(Application Not ...

    Android Handler 图片浏览器

    在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...

    Android Handler机制解析

    Android Handler机制解析 Android Handler机制是Android系统中的一种机制,用于处理线程之间的通信和消息传递。在Android系统中,Handler机制是基于Java的线程机制来实现的。下面将对Android Handler机制进行详细的...

    Android Handler定时更新UI

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    Android Handler 线程 示例代码

    在Android开发中,`Handler`、`Thread`、`Toast`、`消息队列`以及`线程`是实现UI交互和异步处理的关键概念。本文将深入探讨这些概念,并结合给定的"Android Handler 线程 示例代码"进行详细讲解。 首先,我们来看`...

Global site tag (gtag.js) - Google Analytics