自定义Thread Handler

最近項目中出現一個自定義Handler,很是奇怪,原来这样做只是避免在主线程中处理事务,而自定义了一个Handler回调处理

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class RunInOtherThread {

	private LooperThread localThread = new LooperThread();

	public Handler getHandler() {
		return localThread.getHandler();
	}

	private class LooperThread extends Thread {
		private Handler mHandler;

		@SuppressLint("HandlerLeak")
		public void run() {

			Looper.prepare();
			mHandler = new Handler() {
				public void handleMessage(Message msg) {
					onReceiveMessage(msg.what);
				}
			};
			Looper.loop();

		}

		Handler getHandler() {
			return mHandler;
		}

	}

	public void start() {
		localThread.setDaemon(true);
		localThread.start();
	}

	public void quit(boolean isEixt) {

		if(localThread != null && localThread.isAlive()){
			
			localThread.getHandler().getLooper().quit();
			
			localThread.interrupt();
			
			try {
				localThread.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(isEixt){
				localThread = null;
			}
			
		}

	}

	public void sendMessage(int what) {
		getHandler().sendEmptyMessage(what);
	}

	public Thread getThread() {
		return localThread;
	}

	public void onReceiveMessage(int what) {
	}

}

当然 这个Handler只能处理回调,不能进行UI和耗时操作,为了更好的理解,需要看看Thread,Looper,Handler的内在关系

Looper解析ThreadLocal

ThreadLocal

解答:

  • ThreadLocal作为中间人 定义规则ThreadLocalMap 负责取出和存储Thread的中的Looper过程
  • Thread中存储一个ThreadLocalMap
  • Looper中存储mQueue
  • ThreadLocalMap 中存储
    • Key->Thread.Name
    • Value->Looper
  • Looper.prepare ->ThreadLocal帮忙把Thread自己的ThreadLocalMap中的Looper 附上一个初值
  • Looper.myloop-> 根据当前Thread.的name 找中间人ThreadLocal帮忙取出他自己的Looper
  • Looper.loop -.>开启死循环 ,从looper->Message -> msg.target.dispatchMessage(msg);
    PS:
  • MessageQueue:队列,先进后出。
  • Message:是Handler本身。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值