如何使用Android Handler线程消息机制?

      1.从现实生活中理解线程消息机制

      android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的。

      2.Android 的线程消息机制

      android 在设计的时候引入了 wince 的消息机制,即将每一个消息发送到队列里面,遵循先进先出原则。发送消息并不会阻塞线程,而接收线程会阻塞线程,这是因为 Android 的Handler 机制,当Handler 处理完一个 Message 对象才会接着去取下面一个消息进行处理。

      这里记住:Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message)。例如:线程A的Handler对象可以传递消息给别的线程,让别的线程B或C等能送消息来给线程A(存于A的Message Queue里)。线程A的Message Queue里的讯息,只有线程A所属的对象可以处理。

      这里记住:Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message)。例如:线程A的Handler对象可以传递消息给别的线程,让别的线程B或C等能送消息来给线程A(存于A的Message Queue里)。线程A的Message Queue里的讯息,只有线程A所属的对象可以处理。

      案例:

      经典的歌词同步,这时我们不仅要听到优质的歌曲,还要可以有歌词同步,这时另开一条线程来处理歌词的同步是比较好的解决办法,你可以根据自己的定义,抓取歌曲的duration 在线程中处理歌词的前进或者后退。

      3.Demo 分析:

      下面我们来实现一个Iphone 上的一个通过按数字后,数字过多消除的按钮事件。事件的原理如下,事件要的效果是这样的,当长按消除按钮后,数字会慢慢消除,过会消除速度会增快,那么实现这个效果我们就需要自己做一个小键盘,我做的键盘效果如下:

 

      使用的是android 的线程机制。实现代码如下:

 

      Java代码

      private Thread thread;

      private TextView tv_call_no;

      protected static Runnable Runablerun = null;

      private Handler handler;

      private int textLength = 0;

      private boolean isStop = true;

      首先将要使用的数据类型声明在头部,将会使用到 java 的 Thread 和Android Handler 对象,首先实现Runable 对象,代码如下:

      Java代码

      Runablerun = new Runnable() {

 

      @Override

      public void run() {

      // TODO Auto-generated method stub

      try {

      int i = 0;

      do {

      i++;

      Thread.sleep(i > 15 ? 20 : 100);

      Message msg = handler.obtainMessage();

      msg.arg1 = i;

      msg.sendToTarget();

      if (i == textLength) {

        isStop = false;

      }

      } while (isStop);

      } catch (Exception e) {

      // TODO: handle exception

      }

      }

      };
 

 

 

如何: