Android利用ThreadLocal进行Handler数据传递

        android的消息处理大家都知道是用Handler,Message,Looper。关于Message和Handler之间的定义就不多讲了,网上有很多。今天主要来讲一下利用ThreadLocal来传递Handler对象进行多线程,多类之间进行通信。

        利用Handler进行多线程通信时,Handler会把消息传给Looper的消息队列,而Looper的消息队列是属于UI线程的消息队列。所以我们往消息队列里面发送消息,其实是往UI线程的消息队列里发送消息。

        ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

        在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。API方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。那么,支持Handler应该是没有问题的咯。

        自定义一个ThreadLocal类来支持Handler,代码如下:

public class HandlerManager {
	private static ThreadLocal<Handler> threadLocal = new ThreadLocal<Handler>();

	public static Handler getHandler() {
		return threadLocal.get();
	}

	public static void putHandler(Handler value) {
		threadLocal.set(value);//UiThread  id
	}
}

在Activity中进行调用

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		HandlerManager.putHandler(handler);
		init();
	}
	
	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			
			}
		}
	};
	
}

在子线程中,调用如下代码

HandlerManager.getHandler().sendEmptyMessage(int what);
就可以了,是不是觉得处理流程清晰简单多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值