//

Looper

  在UI主线程里面有默认有一个Looper对象来管理UI线程的各条消息,但是在自定义的实现Thread的消息循环和消息派发,缺省情况下Thread是没有这个消息循环的既没有Looper;需要主动去创建将该线程内部的message添加到messagequeue中去,让looper来进行管理添加到,然后启动Looper的消息循环loop;与外部的交互通过Handler进行;

MessageQueue

  消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

  消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。

  一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个

Thread取决于Handler在那个Thread中建立。

  在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,

Handler属于哪个Thread。

//================首先是让handler有一个需要looper对象的构造来看一下,在主线程里面是不是有一个looper对象。

 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.view.View;
 import android.widget.Button;
 import android.widget.TextView;
 import android.app.Activity;

 public class Main extends Activity {
     private Button button;
     private TextView textView;
     private MyHandler handler;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         // 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
         button = (Button) findViewById(R.id.button1);
         textView = (TextView) findViewById(R.id.editText1);
         // 获取looper
         Looper looper = Looper.getMainLooper();  //
         handler = new MyHandler(looper);   //通过这个looper传递过去
         handler = new MyHandler();  ///这个效果和上面的效果执行上是一模一样的。
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 new Thread(new MyThread()).start();
             }
         });
     }

     // 子线程
     public class MyThread implements Runnable {
         @Override
         public void run() {
             // TODO Auto-generated method stub
             Message message = Message.obtain();
             message.obj = "LooperMessage";
             handler.sendMessage(message);
         }
     }

     // 继承一个handler类
     public class MyHandler extends Handler {
         public MyHandler() {
             // TODO Auto-generated constructor stub
         }

         // 定义一个带参构造方法
         public MyHandler(Looper looper) {
             super(looper);
         }

         @Override
         public void handleMessage(Message msg) {
             // TODO Auto-generated method stub
             super.handleMessage(msg);
             textView.setText("-接收消息-->" + msg.obj.toString());
         }
     }

 }

//  验证只有加入到messageQueue的消息队列里面handler才可以获取,处理,分发。而这个messageQueue就是有looper进行管理的。

//这个是从UI主线想子线程中发送消息,只要将将要发送的消息加入到looper管理的messageQueue(主线程)队列中去,在同一个消息队列里面处理一个消息不就很easy吗?

 package com.example.handler_looper_01;

 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.view.View;
 import android.widget.Button;
 import android.widget.TextView;
 import android.app.Activity;

 /**
  * 将消息从UI主线程中发送到子线程中,比较少用~~
  *
  * @author lpp
  *
  */
 public class Main extends Activity {
     private Button button;
     private TextView textView;
     private Handler handler; // 获取handler对象

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         // 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
         button = (Button) findViewById(R.id.button1);
         textView = (TextView) findViewById(R.id.editText1);
         // 启动线程
         new Thread(new MyThread()).start();
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 Message message = Message.obtain();
                 message.obj = "UI的message";
                 handler.sendMessage(message);
             }
         });
     }

     // 子线程
     public class MyThread implements Runnable {
         @Override
         public void run() {
             // 在线程里面与activity不一样是没有looper与之进行关联。因此是无法接收到looper里面的消息!直接报错
             Looper.prepare(); // 循环消息队列
             // 接受Ui主线程发送过来的消息
             handler = new Handler() {
                 @Override
                 public void handleMessage(Message msg) {
                     super.handleMessage(msg);
                     // CalledFromWrongThreadException: Only the original thread
                     // that created a view hierarchy can touch its views.
                     // textView.setText(msg.obj.toString()); //
                     // 这属于在子线程中更新UI,会直接报错!
                     System.out.println(msg.obj.toString());

                 }
             };
             Looper.loop(); // 知道消息队列循环结束
         }
     }
 }

消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。

  所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,

而建立Handler的关键就是这个Looper。

  一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个

Thread取决于Handler在那个Thread中建立。

  在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,

Handler属于哪个Thread。

android消息处理机制之2handler与looper,MessageQueue:的关系的更多相关文章

  1. 解析Android消息处理机制:Handler/Thread/Looper & MessageQueue

    解析Android消息处理机制 ——Handler/Thread/Looper & MessageQueue Keywords: Android Message HandlerThread L ...

  2. Android -- 消息处理机制源码分析(Looper,Handler,Message)

    android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

  3. (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)

    转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...

  4. 【Android 开发】: Android 消息处理机制之一: Handler 与 Message

    最近几讲内容,我们学习了Android中关于多线程的一些知识,上一讲我们讲解了异步任务 AsyncTask 的操作,Android中还提供了其他的线程操作,如Handler Message Messa ...

  5. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  6. Android架构分析之Android消息处理机制(一)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在这个系列文章中我们将来分析Android消息处理机制. 本文介绍了一个使用Han ...

  7. 7.1 基础知识Android消息处理机制

    1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程 ...

  8. Android消息处理机制

    Android消息处理机制 Android应用程序消息处理机制(深入到native,实际由管道实现-pipe&epoll)

  9. Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

    在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...

随机推荐

  1. 解决Cannot delete or update a parent row: a foreign key constraint fails (`current_source_products`.`product_storage`, CONSTRAINT `product_storage_ibfk_3` FOREIGN KEY (`InOperatorID`)

    出现这个异常的原因是因为设置了外键,造成无法更新或删除数据. 1.通过设置FOREIGN_KEY_CHECKS变量来避免这种情况 删除前设置 SET FOREIGN_KEY_CHECKS=0; 删除完 ...

  2. 【OpenCV】视频取坐标

    今天实现了视频播放以后暂停获取鼠标点击处坐标的功能. #include <iostream> #include <opencv2/highgui/highgui.hpp> #i ...

  3. mysql快速导入大量数据问题

    今天需要把将近存有一千万条记录的*.sql导入到mysql中.使用navicate导入,在导入100万条之后速度就明显变慢了, 导入五百万条数据的时候用了14个小时,且后面的数据导入的越来越慢. 后来 ...

  4. 【java基础学习二】 数组相互转换,转成用逗号隔开的字符串等

    /** * int[],Integer[],List,List<Integer>,HashSet<Integer>相互转换,转成用逗号隔开的字符串 */ public stat ...

  5. 手动安装 atom 扩展包 packages

    由于某些原因, 我们下载 atom 扩展时发现速度特别慢, 或者根本无法下载, 那我们可以尝试手动安装 首先, 从 github 上下载(或其它地方) 扩展包, 解压 进入该文件夹, 找到 packa ...

  6. function [ binary,decimal ] = num2binary16( number )

    function [ binary,decimal ] = num2binary16( number ) %The IEEE 754 standard specifies a binary16 as ...

  7. R 语言画图的基本参数

    R 语言画图的基本参数 点 点的种类 点的种类参数为 pch,每一种符号对应一个数字编号 # 点有25种,为了展示25种点 x = 1:25 y = 1:25 x ## [1] 1 2 3 4 5 6 ...

  8. thinkphp 支付宝错误 Class &#39;Think&#39; not found

    Class 'Think' not found D:\www\DonatePlatform\ThinkPHP\Extend\Vendor\alipay\lib\alipay_submit.class. ...

  9. Tomcat配置域名/IP访问及其中遇到的问题注意事项

    1.先在tomcat下的conf下找到server.xml文件,用记事本打开后,首先对端口号进行修改,以前一直以为8080是默认的端口号,其实默认的端口号是80 <Connector port= ...

  10. vue动画

    最近想搞搞vue的过渡和动画,以为照着官网写就好了,谁知道还是出现一些状况 具体表现就是不用webpack打包时候写的过渡是正常的,而用了webpack打包就不正常了 说使用了未定义的element: ...