Handler-(静态全局使用-设计)-synchronized 理解

1. 声明一个类

public class DispatchHandler {
	public final static int SHOW_SHORTNOTICE = 255;
	public final static int SHOW_LONGNOTICE = 254;
	private static Handler handler = null;

	public static Handler setHandler(Handler h) {
		if (null != handler) {
			synchronized (handler) {
				Handler o = handler;
				handler = h;
				return o;
			}
		} else {
			handler = h;
			return h;
		}
	}

	public static Handler getHandler() {
		if (null != handler) {
			synchronized (handler) {
				return handler;
			}
		} else {
			return null;
		}
	}

	public static boolean isCurrent(Handler h) {
		return h == handler;
	}

	public static boolean sendMessage(Message msg) {
		if (null != handler) {
			synchronized (handler) {
				return handler.sendMessage(msg);
			}
		} else {
			return false;
		}
	}
	public static void submitLongNotice(String info) {
		if (null != handler) {
			android.os.Message msg = new android.os.Message();
			msg.what = SHOW_SHORTNOTICE;
			msg.obj = info;
			sendMessage(msg);
		}
	}
}

2.在Activity中

a.在主界面中声明Handler对象uiHandler 
  在oncreate中将uiHandler赋值给DispatchHandler 
  即DispatchHandler.setHandler(uiHandler);


b.跳转到其他Activity时,eg:AudioActivity,同样采用b的方法:

  handler oldHandler = DispatchHandler.setHandler(audioHandler);


d.再跳到其他Activity时,eg:videoActivity

   在AudioActivity 退出时:执行如下
   if(DispatchHandler.isCurrent(audioHandler){

DispatchHandler.setsetHandler(oldHandler);
   }
   在videoActivity中:
   handler oldHandler = DispatchHandler.setHandler(videoHandler);


3.DispatchHandler中用到synchronized (同步)

a.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
b.当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
c.尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
d.接着c继续理解,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值