android Looper Handler

来源:互联网 发布:macbookpro破解软件 编辑:程序博客网 时间:2024/06/01 14:54
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();      }}


单向的消息触发模型.

每个线程可以对应一个消息循环队列Looper.消息循环队列Looper提供一个句柄Handler, 其他线程获得该Looper的句柄Handler可以将消息发给该消息循环队列Looper.

可以通过重写handleMessage对消息进行处理.

Looper.prepare()是创建消息循环队列

Looper.loop()是启动该消息循环队列.Looper.loop()相当于一个循环,没有消息时将会等待,有消息则进行处理.

所以Looper.loop()后的代码是没法执行的.


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();          //could not run this code          Log.v("test", "hello");      }}

只有在Looper结束后会执行Looper.loop()后的代码.你可以在handleMessage中调用Looper.quit().像下面这样.

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.myLooper().quit();                  //or this.getLooper().quit();              }          };          Looper.loop();          //could not run this code          Log.v("test", "hello");      }}

注意Activity结束或者被覆盖时要根据应用的逻辑将相应的线程退出,显然Looper对应的线程一直在等待和处理消息.

那么一定要调用Looper.quit().

但是一般不像上面那样结束Looper,在别的线程,一般是主控线程或逻辑控制线程,可以通过Looper的句柄handler来处理.

调用mHandler.getLooper().quit()即可.

android的主线程默认是有消息循环队列的.因此不需要调用Looper.prepare().

public class TestActivity extends Activitypublic Handler m_handler;public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //don't need to call Looper.prepare()    m_handler = new Handler(){    public void handlMessage(Message msg){    //handle msg here    }    };    //neither Looper.loop()    }        }