handler调用handlerMessage时是在创建handler的那个线程里面运行吗?

解决方案 »

  1.   

    handlermessage 是在Looper 运行的线程运行的。
      

  2.   

    举个例子HandlerThread thread = new HandlerThread("PPCommandProcessThread", Process.THREAD_PRIORITY_BACKGROUND);  
            thread.start();  
            looper = thread.getLooper();  
            handler = new PPCommandProcessHandler(looper);
    那么你这个handler就是运行在PPCommandProcessThread这个线程里面,你new handler的时候没有传值,就默认为你调用的线程里面运行。
    每个应用程序都有一个主线程(UI线程),一般情况下handler都是运行在主线程中,除非你自己创建了子线程。
      

  3.   

    两种方式:
    1. 默认使用方式:
    Handler mHandler = new Handler ();
    这种情况下,handlerMessage()是运行在创建Handler的线程;
    一般,我们都是在主线程里面创建的Handler,因此,handlerMessage()是运行在主线程里面。
    如果在其它线程中创建的Handler,那handlerMessage()是运行在该线程里面。但有一个前提,该线程必须有Looper,如果没有,Handler则创建失败,会抛出RuntimeException:"Can't create handler inside thread that has not called Looper.prepare()",该Exception告诉我们,在创建Handler前,需要调用Looper.prepare();对于主线程,则不需要,因为程序在启动时,主线程(即UI线程)已调用过Looper.prepare()。
    以下是一个简单的示例代码:Code 1:
    Handler mInnerHandler;new Thread(new Runnable() {
        
        @Override
        public void run() {
            Looper.prepare(); // 准备Looper,否则下面创建Handler会失败
            
            mInnerHandler= new Handler() {
                public void handleMessage(android.os.Message msg) {
                    // Do something...
                };
            };
            
            Message message = mInnerHandler.obtainMessage();
            mInnerHandler.dispatchMessage(message);
            
            Looper.loop();
        }
    }).start();~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Code 2:
    class LooperThread extends Thread {
        public Handler mHandler;
        
        public void run() {
            Looper.prepare();  // 准备Looper,否则下面创建Handler会失败
            
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    // process incoming messages here
                }
            };
            
            Looper.loop();
        }
    }
    2. 指定Looper来创建:
    Handler mHandler = new Handler(Looper looper)
    一般我们都会指定主线程的Looper。调用方式如下:
    Handler mHandler = new Handler(Looper.getMainLooper())
    此时,对应的handlerMessage()是运行在创建Looper对应的线程,即主线程,当然,你可以替换成你想要的任何线程;总结:如2楼所说,handlermessage 是在Looper 运行的线程中运行的。
    实际上,每个Handler都会关联到一个Looper,这点通过Handler的源码就能看得到,它所绑定的Looper是处于哪个线程,那么Handler的handlerMessage、dispatchMessage最终的都是运行在对应的线程中的。