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对象所有同步代码部分的访问都被暂时阻塞。