012android初级篇之Handler机制

设计Handler类的目的

Handler类被用来注册到一个线程中,这样能够提供一个简单的通讯渠道,用来发送数据到这个线程。
可做为UI线程与后台线程交互的几种方法之一。html

具体用途

  1. 消息的分发和处理,安排 messages 和 runnables在将来某个时刻被执行;
  2. 队列action在其余线程上被执行;android

    与之相关的类:looper类,

    looper 主要功能是为特定单一线程运行一个消息环。ide

  3. 一个线程对应一个looper。一样一个looper对应一个线程。这就是所谓的特定单一;
  4. 通常状况下,在一个线程建立时他自己是不会产生他特定单一的looper的(主线程是个例外)。所以咱们须要手动的把一个looper与线程相关联。其方法只需在须要关联的looper的线程中调用Looper.prepare。以后咱们再调用Looper.loop启动looper。
    以下例子:函数

    class NetWorkThread implements Runnable 
     {
         public MyHandler mHandler =new MyHandler();
         @Override
         public void run() {
    
             Looper.prepare();
             //mHandler =new MyHandler();
             Looper.loop();
         }
     }
  5. 具体的说,在咱们将特定单一looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。而后线程就会根据message中的内容进行相应的操做。
  6. looper和handler并不是一一对应的。一个looper能够对应多个handler,而一个handler只能对应一个looper。handler和looper的绑定,是在构建handler的时候实现的,具体查询handler的构造函数。
  7. message,虽然咱们能够本身建立一个新的message,可是更加推荐的是调用handler的obtainMessage方法来获取一个message。这个方法的做用是从系统的消息池中取出一个message,这样就能够避免message建立和销毁带来的资源浪费了。oop

假设A线程要传递信息给B线程,咱们须要作的就是

  1. 在B线程中调用Looper.prepare和Looper.loop。(主线程不须要)
  2. 编写Handler类,重写其中的handleMessage方法。
  3. 建立Handler类的实例,并绑定looper
  4. 调用handler的sentMessage方法发送消息。

实例代码线程

NetWorkThread mNetWorkThread =new NetWorkThread();
new Thread(mNetWorkThread).start();
Message msg = mNetWorkThread.mHandler.obtainMessage();
msg.arg1=12;
mNetWorkThread.mHandler.sendMessage(msg);

Message相关

Message的使用样例设计

Message message = Message.obtain();  
message.arg1 = 1;  
message.arg2 = 2;  
message.obj = "Demo";  
message.what = 3;  
Bundle bundleData = new Bundle();  
bundleData.putString("Name", "Lucy");  
message.setData(bundleData);

Message能够传递的参数有

  1. public int arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型
  2. public Object object 类型
  3. public int what 用户自定义的消息代码,这样接受者能够了解这个消息的信息。每一个handler各自包含本身的消息代码,因此不用担忧自定义的消息跟其余handlers有冲突。
  4. 其余的能够经过Bundle进行传递

Message的构造函数

Message能够经过new Message构造来建立一个新的Message,可是这种方式很很差,不建议使用。最好使用Message.obtain()来获取Message实例,它从消息池获取。code

参考连接

  1. Android开发中Handler的经典总结
  2. Android background processing with Handlers, AsyncTask and Loaders - Tutorial
  3. Android中UI线程与后台线程交互设计的5种方法
  4. Java中Runnable和Thread的区别
  5. Android:主线程如何向子线程发送消息
  6. android parcelable 详解
相关文章
相关标签/搜索