Handler机制运行原理和使用

Hanlder机制中的四个重要概念
  • Handler : 对消息的处理
  • Message : 子线程像主线程发送消息时,用于携带数据
  • MessageQueue :消息队列,存放Message的一个集合
  • Looper : 循环从MessageQueue 中取出Message,将其发送给handler
工作流程

主线程会自动创建Looper和MessageQueue, 创建Handler对象,在子线程创建Message对象,通过Handler对象调用sendMessage()方法,把Message对象发送到消息队列MessageQueue,此时Looper对象无限循环检测到消息队列MessageQueue不为空,便会循环逐个取出队列中的消息,此时回调disPatchMessage()方法,把Message对象传递到handlerMessage方法中,同时从消息队列MessageQueue释放掉已传递的Message对象。

通过Handler在子线程向主线程发送消息
public class MainActivity extends AppCompatActivity {

	private Button mSendButtonView;

	Handler mHandler = new Handler(){
    	@Override
    	// 定义处理消息的方法
    	public void handleMessage(Message msg) {
        	if (msg.what == SEND_MESSAGE) {
                    Logger.i(TAG, "handleMessage:---->" + msg.obj);
               }
    	}
	};

   	@Override
	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);
    	mSendButtonView = (Button)findViewById(R.id.send);

   	 	mSendButtonView .setOnClickListener(new View.OnClickListener() {
        	@Override
       	 	public void onClick(View v) {
       	 		new Thread(new Runnable() {
        			@Override
        			public void run() {
            			Message msg = Message.obtain();
            			msg.what = SEND_MESSAGE;
            			msg.obj = "这是子线程向主线程发送的消息";
            			mHandler.sendMessage(msg);
        			}
    			}).start();
       	 	}
   	 	});
	}
}
通过Handler可以在主线程向子线程发送消息

上面说了在子线程向主线程发送消息时,主线程会自动创建Looper和MessageQueue,在这里要注意在子线程使用Handler时不会自动创建,需要自己手动创建,其它流程和子线程向主线程发送消息没什么区别

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
private static final int SEND_MESSAGE = 10;

private Button mSendButtonView;

private Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSendButtonView = (Button) findViewById(R.id.send_btn);
    mSendButtonView .setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Message msg = Message.obtain();
            msg.what = SEND_MESSAGE;
            msg.obj = "这是主线程向子线程发送的消息";
            mHandler.sendMessage(msg);
        }
    });
    
    new Thread(new HandlerRunnable ()).start();
}

private class HandlerRunnable implements Runnable {
    @Override
    public void run() {
       //1、初始化Looper
        Looper.prepare();
        //2、绑定handler到CustomThread实例的Looper对象
        mHandler = new Handler() {
            //3、定义处理消息的方法
            public void handleMessage(Message msg) {
                if (msg.what == SEND_MESSAGE) {
                    Logger.i(TAG, "handleMessage:---->" + msg.obj);
                }
            }
        };
        //4、启动消息循环
        Looper.loop();
    }
}

你可能感兴趣的:(android)