官方解读之 Looper、Handler、Thread

来源:互联网 发布:网络借贷属于金融吗 编辑:程序博客网 时间:2024/06/05 17:24
Looper
    这个类主要是用来为一个线程执行消息循环的!线程默认情况下是没有与之相关联的消息循环,要想为线程创建一个消息循环,就必须在需要运行消息循环的线程中调用prepare()方法,然后就可以调用Looper的loop()方法来处理消息知道loop停止!
    我们几乎都是通过Handler类和消息循环进行交互。

    这里有一个典型的实现了Looper线程的例子,在调用prepare()和loop()方法之中创建并初始化了一个Handler来和Looper通信!

    class LooperThread extends Thread {      public Handler mHandler;      public void run() {          Looper.prepare();          mHandler = new Handler() {              public void handleMessage(Message msg) {                  // process incoming messages here              }          };          Looper.loop();      }  }
Handler
   一个Hnadler允许你发送和处理消息以及和线程消息队列相关的Runnable对象。每一个Handler实例是和单个线程以及该线程的消息队列相关的。当你创建了一个Handler时,该Handler就和创建它的那个线程的线程/消息队列绑定了————自那时起,他将会分发消息和runnables到消息队列中去,并且当他们从消息队列中被取出来时执行它们!
   Handler有两种主要的用法:1、调度消息和runnables在将来的某个时刻被执行;2、插入一个将在其它线程而非自己线程中执行的动作。
   调度消息是通过 post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), 和sendMessageDelayed(Message, long) 这些方法完成的。和post相关的函数允许你将Runnable对象加入队列,他们可以被消息队列调用;和sendMessage相关的函数允许你将一个含有bundle数据对象的消息加入队列!带有数据的bundle可以被Handler的handlerMessage(Message)方法处理(需要你实现Handler的子类)。
   当上传或是发送到Handler,你可选择在消息队列就绪的时候立即处理这个条目,也可以选择指定它被处理的延时或者是它被处理的绝对时间点。后两种选择允许你实现timeouts,ticks或者其它基于时间的动作。
   当为自己的应用程序创建了一个进程的时候,该进程的主线程将会运行一个消息队列以辅助管理顶级应用组件(例如activities、broadcast receivers等等)和它创建的任何窗口。你可以创建自己的线程,通过Handler和应用的主线程通信。这个可以通过在新建的线程中调用相同的post方法和sendMessage方法。已给出的Runnable或者是消息将会在Handler的消息队列中被调度并且在合适的时候得到处理。

Thread
   一个线程就是一些同时执行的动作的集合。它有自己的调用栈用于函数调用、它们的参数以及局部变量。当每一个虚拟机实例启动时它至少有一个主线程运行着;更为典型的是还有其它几个用于辅助管理。应用程序可以为了特殊的目的而开启额外的线程。
   在同一个虚拟机中的所有线程通过使用共享对象以及与这些对象相关的监视者来完成交互和同步!同步方法和Object的部分API也允许线程间协作。
   这里有两种基本的方法使得线程可以执行应用程序代码。一个是提供一个新的类,该类继承自Thread并且覆盖run()方法;另外一个就是提供一个新的Thread实例并且在其创建的时候提供一个Runnable对象。在所有的情况下,我们都必须通过调用start()方法来真正的执行一个新的线程。
   每一个线程都有一个整型的优先级,这个优先级决定了该线程可获得的CPU时间。可以通过setPriority(int)方法来设置。一个线程同样可以成为一个守护线程,可以使得该线程运行于后台。使线程作为守护线程运行将会导致虚拟机停止的行为,当没有线程作为守护线程运行的时候,虚拟机是不会自动停止的!