• UI主线程发送消息给非UI线程
    •  说明1:无论是UI主线程还是非UI线程,需要接受另外一个线程发送的消息,就必须使用Handler来接收
    •    说明2:UI主线程系统已经默认创建了Looper和MessageQueue。所以在子线程发送消息给UI主线程的时候并不需要再去创建。相反UI线程发送消息给子线程的话,子线程必须先创建Looper(消息泵)和 MessageQueue(消息队列)
  • 子线程中创建MessageQueue和Looper
    •  Looper.prepare();//1、初始化Looper和MessageQueue
      
      //以下是Android源码。可以看一下创建过程
      //通过源码可以看出,Looper和MessageQueue是一块被创建的
      //而且MessageQueue和Looper是一对一的关系
       public static void prepare() {
              prepare(true);
          }
      
          private static void prepare(boolean quitAllowed) {
              if (sThreadLocal.get() != null) {
                  throw new RuntimeException("Only one Looper may be created per thread");
              }
              sThreadLocal.set(new Looper(quitAllowed));
          }
       private Looper(boolean quitAllowed) {
              mQueue = new MessageQueue(quitAllowed);
              mThread = Thread.currentThread();
       }

       

  • 完整的示例
  • package com.zhuozhuo;
    
    import android.app.Activity;
    
    import android.os.Bundle;
    
    import android.os.Handler;
    
    import android.os.Looper;
    
    import android.os.Message;
    
    import android.util.Log;
    
    import android.view.View;
    
    import android.view.View.OnClickListener;
    
    
    
    public class LooperThreadActivity extends Activity{
    
        /** Called when the activity is first created. */
        private final int MSG_HELLO = 0;
        private Handler mHandler;
        @Override
    
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.main);
    
            new CustomThread().start();//新建并启动CustomThread实例
    
            
    
            findViewById(R.id.send_btn).setOnClickListener(new OnClickListener() {
    
                
    
                @Override
    
                public void onClick(View v) {//点击界面时发送消息
    
                    String str = "hello";
    
                    Log.d("Test", "MainThread is ready to send msg:" + str);
    
                    mHandler.obtainMessage(MSG_HELLO, str).sendToTarget();//发送消息到CustomThread实例
    
                    
    
                }
    
            });
    
            
    
        }
    
        class CustomThread extends Thread {
    
            @Override
    
            public void run() {
    
                //建立消息循环的步骤
    
                Looper.prepare();//1、初始化Looper
    
                mHandler = new Handler(){//2、绑定handler到CustomThread实例的Looper对象
    
                    public void handleMessage (Message msg) {//3、定义处理消息的方法
    
                        switch(msg.what) {
    
                        case MSG_HELLO:
    
                            Log.d("Test", "CustomThread receive msg:" + (String) msg.obj);
    
                        }
    
                    }
    
                };
                Looper.loop();//4、启动消息循环
            }
        }
    
    }

     

 

posted on 2016-06-25 11:48  ningge103  阅读(110)  评论(0)    收藏  举报