Hander looper messageQueue

package android.os;


public class Handler {
    public Handler() { /* compiled code */ }


    public Handler(android.os.Handler.Callback callback) { /* compiled code */ }


    public Handler(android.os.Looper looper) { /* compiled code */ }


    public Handler(android.os.Looper looper, android.os.Handler.Callback callback) { /* compiled code */ }


    public void handleMessage(android.os.Message msg) { /* compiled code */ }


    public void dispatchMessage(android.os.Message msg) { /* compiled code */ }


    public java.lang.String getMessageName(android.os.Message message) { /* compiled code */ }


    public final android.os.Message obtainMessage() { /* compiled code */ }


    public final android.os.Message obtainMessage(int what) { /* compiled code */ }


    public final android.os.Message obtainMessage(int what, java.lang.Object obj) { /* compiled code */ }


    public final android.os.Message obtainMessage(int what, int arg1, int arg2) { /* compiled code */ }


    public final android.os.Message obtainMessage(int what, int arg1, int arg2, java.lang.Object obj) { /* compiled code */ }


    public final boolean post(java.lang.Runnable r) { /* compiled code */ }


    public final boolean postAtTime(java.lang.Runnable r, long uptimeMillis) { /* compiled code */ }


    public final boolean postAtTime(java.lang.Runnable r, java.lang.Object token, long uptimeMillis) { /* compiled code */ }


    public final boolean postDelayed(java.lang.Runnable r, long delayMillis) { /* compiled code */ }


    public final boolean postAtFrontOfQueue(java.lang.Runnable r) { /* compiled code */ }


    public final void removeCallbacks(java.lang.Runnable r) { /* compiled code */ }


    public final void removeCallbacks(java.lang.Runnable r, java.lang.Object token) { /* compiled code */ }


    public final boolean sendMessage(android.os.Message msg) { /* compiled code */ }


    public final boolean sendEmptyMessage(int what) { /* compiled code */ }


    public final boolean sendEmptyMessageDelayed(int what, long delayMillis) { /* compiled code */ }


    public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) { /* compiled code */ }


    public final boolean sendMessageDelayed(android.os.Message msg, long delayMillis) { /* compiled code */ }


    public boolean sendMessageAtTime(android.os.Message msg, long uptimeMillis) { /* compiled code */ }


    public final boolean sendMessageAtFrontOfQueue(android.os.Message msg) { /* compiled code */ }


    public final void removeMessages(int what) { /* compiled code */ }


    public final void removeMessages(int what, java.lang.Object object) { /* compiled code */ }


    public final void removeCallbacksAndMessages(java.lang.Object token) { /* compiled code */ }


    public final boolean hasMessages(int what) { /* compiled code */ }


    public final boolean hasMessages(int what, java.lang.Object object) { /* compiled code */ }


    public final android.os.Looper getLooper() { /* compiled code */ }


    public final void dump(android.util.Printer pw, java.lang.String prefix) { /* compiled code */ }


    public java.lang.String toString() { /* compiled code */ }


    public static interface Callback {
        boolean handleMessage(android.os.Message message);
    }

}


android的Handler 例子

Handler类的主要作用有两个:
  • 在新启动的线程中发送消息
  • 在主线程中获取、处理消息

       上面的说法很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取、并处理消息。 但这个过程涉及一个问题:新启动的线程何时发送消息呢?

主线程何时去获取并处理消息呢?这个时机显然不好控制。 (Handler是异步消息机制)

       为了让主线程能“适时”地处理新启动的线程所发送的信息,显然只能通过回调的方式来实现-----开发者只要重新Handler类中处理消息的方法,当新启动的线程发消息时,Handler类中处理消息的方法被自动回调。

Handler类包含如下方法用于发送、处理消息。

  • void handleMessage(Message msg): 处理消息的方法。该方法通常用于被重写
  • final boolean hasMessages(int what): 检查消息队列中是否包含what属性为指定值的消息。
  • final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且Object属性为指定对象的消息。
  • 多个重载的Messge obtainMessage(): 获取消息。
  • sendEmptyMessage(int what): 发送空消息。
  • final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之后发送空消息
  • final boolean sendMessage(Message msg): 立即发送消息。
  • final boolean sendMessageDelayed(Message msg, long delayMillis):  指定多少毫秒之后发送消息

借助上面这些方法,程序可以方便利用Handler来进行消息传递。


关键词

  Android.os.Handler涉及较多的知识点,我把一些关键词列举在下面,将主要介绍Handler:
  •   android.os.Handler 、 android.os.Handler.Callback
  •   Looper、
  •   Threadle、Runnable
  •   Message、Message queue

android.os.Handler

  Handler在android里负责发送和处理消息。它的主要用途有:
  1)按计划发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
   默认情况下,Handler接受的是当前线程下的消息循环实例(使用 Handler( Looper looper)、 Handler( Looper looper,  Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

start~end例子

main.xml


界面图

Hander looper messageQueue_第1张图片

HandlerTestActivity.java


点击start后每隔3秒打印 不点击end,就一直打印 Hander looper messageQueue_第2张图片

参考文献

   android学习笔记之消息机制,异步和多线程
   android handler概念解释
   SDK

系列索引

   Android 开源项目-StandupTimer学习笔记索引  

更多参考http://www.cnblogs.com/keyindex/articles/1822463.html



你可能感兴趣的:(实习开发--android)