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();
					  }
				));
			 }
 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值