Android Message 简单学习笔记(转载与整理)

转载 2013年12月04日 00:02:10

Message类用于android中多个线程间的通信,消息处理涉及的一个重要类是Handler,主要的功能是完成Activity的Widget与应用程序中线程之间的交互

Handler是消息的处理者,handler负责将需要传递的信息封装成Message,通过调用handler对象的obtainMessage()来实现;
将消息传递给Looper,这是通过handler对象的sendMessage()来实现的。继而由Looper将Message放入MessageQueue中。
当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler对象收到该消息后,调用相应的handler对象的handleMessage()方法
对其进行处理。

//不能在非主线程的线程里面更新UI

通俗讲就是在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过 handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这 个thread拥有UI线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler向UI线程发送数据,由UI线程去更新界面。

开发带有Handler类的程序步骤如下。

在Activity或Activity的Widget中开发Handler类的对象,并重写handleMessage方法。

在新启动的线程中调用sendEmptyMessage或者sendMessage方法向Handler发送消息。

Handler类的对象用handleMessage方法接收消息,然后根据消息的不同执行不同的操作。


    在Android 中Handler和Message、Thread有着很密切的关系。Handler 主要是负责Message的分发和处理。但是这个Message从哪里来的呢?Message 由一个消息队列进行管理,而消息队列却由一个Looper进行管理。Android系统中Looper负责管理线程的消息队列和消息循环。 


可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的 Looper对象。


Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消 息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该 线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。


虽说 特定线程的消息只能分发给本线程,不能进行跨线程通讯,但是由于可以通过获得线程的Looper对象来进行曲线的实现不同线程间消息的传递。



考虑线程间的通信如下:

1,只有一个主线程,主线程给自己发消息

发送消息:

Looper looper=Looper.getMainLooper();//获得主线程的Looper对象

MyHandler handler =new MyHandler(looper);//以主线程的Looper对象创建handler,所以这个handler发送的消息会被传递到主线程的MessageQueue

handler.removeMessage(0);
Message msg = handler.obtainMessage(1,1,1,"来自主线程的消息");//构建Message对象
//第一个参数:指定message代号,方便在handler接收消息时的处理
//第二三个参数没什么意义
//第四个参数封装的消息
handler.sendMessage(msg);//发送消息

接收消息和消息处理:
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){
super.handleMessage(msg);
textView.setText("主线程Hanlder,收到了消息:"+(String)msg.obj);
}
}
2.其他进程主线程发消息

发送消息:
   //主线程里启动了一个线程来操作消息的封装和发送的工作
   //这样原来主线程的发送就变成了其他线程的发送
    new MyThread().start();    

    //加了一个线程类用于发送消息
    class MyThread extends Thread{
        
        public void run(){
            Looper looper = Looper.getMainLooper(); //主线程的Looper对象
            //以主线程的Looper对象创建了handler,
            //这个handler发送的Message会被传递给主线程的MessageQueue。
            handler = new MyHandler(looper);

            //构建Message对象
            //第一个参数:是自己指定的message代号,方便在handler选择性地接收
            //第二三个参数没有什么意义
            //第四个参数需要封装的对象
            Message msg = handler.obtainMessage(1,1,1,"来自其他线程的消息");
            
            handler.sendMessage(msg); //发送消息            
        }
    }

接收消息和消息处理:
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){
super.handleMessage(msg);
textView.setText("主线程Hanlder,收到了消息:"+(String)msg.obj);
}
}

3.主线程给其他进程发消息

其他进程发送消息:
class MyThread extends Thread{
        
        public void run(){
            Looper.prepare(); //创建该线程的Looper对象,用于接收消息
            
            //注意了:这里的handler是定义在主线程中的
            //这里Looper.myLooper()获得的就是该线程的Looper对象,用来实例化主线程中的handler
            handler = new ThreadHandler(Looper.myLooper());
            
            //循环从MessageQueue中取消息。
            Looper.loop(); 


        }
        
        //定义线程类中的消息处理类
        class ThreadHandler extends Handler{
            
            public ThreadHandler(Looper looper){
                super(looper);
            }
            
            public void handleMessage(Message msg){
                //这里对该线程中的MessageQueue中的Message进行处理
                //返回给主线程一个消息
                handler = new MyHandler(Looper.getMainLooper());
                
                Message msg2 = handler.obtainMessage(1,1,1,"子线程收到:"+(String)msg.obj);
                
                handler.sendMessage(msg2);
            }
        }

主线程接收消息:
       //启动线程
        new MyThread().start();    
        
        btnTest.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                //这里handler的实例化在线程中
                //线程启动的时候就已经实例化了
                Message msg = handler.obtainMessage(1,1,1,"主线程发送的消息");
                handler.sendMessage(msg);
            }
        });
    }
    
    class MyHandler extends Handler{
        
        public MyHandler(Looper looper){
            super(looper);
        }
        
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            textView.setText("主线程的Handler,收到了消息:"+(String)msg.obj);
        }
    }
4.其他线程给自己发送消息:

    class MyHandler extends Handler{
        
        public MyHandler(Looper looper){
            super(looper);
        }
        
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            textView.setText((String)msg.obj);
        }
    }    
    
    class MyThread extends Thread{
        
        public void run(){
            Looper.prepare(); //创建该线程的Looper对象
            //这里Looper.myLooper()获得的就是该线程的Looper对象了
            handler = new ThreadHandler(Looper.myLooper());
            Message msg = handler.obtainMessage(1,1,1,"我自己");
            handler.sendMessage(msg);
            
            Looper.loop(); 

        }
        
        //定义线程类中的消息处理类
        class ThreadHandler extends Handler{
            
            public ThreadHandler(Looper looper){
                super(looper);
            }
            
            public void handleMessage(Message msg){
                //这里对该线程中的MessageQueue中的Message进行处理
                //这里我们再返回给主线程一个消息
                //加入判断看看是不是该线程自己发的信息
                if(msg.what == 1 && msg.obj.equals("我自己")){
                    
                    handler = new MyHandler(Looper.getMainLooper());
                    
                    Message msg2 = handler.obtainMessage(1,1,1,"禀告主线程:我收到了自己发给自己的Message");
                    
                    handler.sendMessage(msg2);                
                }

            }
        }
    }


     

相关文章推荐

Android学习笔记:线程:Message和Runnable

程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没有反应,ActivityManager会没有提示就kill了activity。然而,activity可能真的需要时间来进行处理...

Android学习笔记(三一):线程:Message和Runnable

原文出处:http://blog.csdn.net/flowingflying/article/details/6370184 程序需要相应用户的操作,最要能在200ms(0.2...

Android 学习笔记17:Handler,Looper,Message原理

Android中的UI线程(主线程)不是线程安全的(并发访问变量,会导致结果不可预知),所以无法再非UI线程中更新UI. 解决方法是使用Handler+Message.Handler默认会有一个当前...
  • skqcsy
  • skqcsy
  • 2014年09月14日 03:35
  • 523

Android学习笔记(三一):线程:Message和Runnable

程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没有反应,ActivityManager会没有提示就kill了activity。然而,activity可能真的需要时间来进行处理...

message broker 学习笔记1

  • 2010年08月21日 21:48
  • 49KB
  • 下载

java mail学习笔记4——Message类详解

Message类 在Java Mail 中Message类是所有电子邮件的的超类它的定义如下: public abstract class javax.mail.Message imple...

WPF学习笔记(1)——Click for message

最近由于手里有小项目,故准备开始学习VS中的WPF,由于本人基础实在不行,故写下此博客,望与零基础入门的同道携手共进,希在前路优雅行走的大神不吝赐教......... WPF(Windows...

(学习笔记)Java Message Digest Algorithm MD5

 Message Digest Algorithm MD5(中文名为:消息摘要算法第五版):为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。 以下为Java语言的MD5实...

java mail学习笔记4——Message类详解

Message类 在Java Mail 中Message类是所有电子邮件的的超类它的定义如下: public abstract class javax.mail.Message imple...

Handler、Looper、Message学习笔记

1、概述Looper的主要工作是维护一个消息队列,循环地执行以下操作: (1)从队列中取出消息 (2)将消息交付给Handler处理 (3)回收该消息Handler的主要工作便是发送消息以及处理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Message 简单学习笔记(转载与整理)
举报原因:
原因补充:

(最多只允许输入30个字)