打开应用时,往往会存在许多消息要与用户进行交互,入更新Dialog、权限框、引导蒙层(只在第一次时出现)、提示去实名框(只在第一次出现)……对于这种可能会不定期新增的首页消息,最好的处理方式是将其放入队列中,先入先出,以保证每次只有唯一的消息与用户交互。
这里我选择使用观察者模式+handler+queue的方式进行处理,处理方式如下(按步骤写是我一贯的风格哈):
1、在MainActivity的onCreate中注册观察者 ,(为了避免显得又臭又长,观察者与被观察者类就不贴上来了)
MainQueueDataChange.getInstance().addObserver(watcher);
2、获得需要入队的消息,进行入队 ,若队列为空,直接通知观察者
if (mTipQueue.isEmpty()) {
mTipQueue.offer(SHOWHOMEHELP);
MainQueueDataChange.getInstance().notifyDataChange(mTipQueue);
} else if(!mTipQueue.contains(SHOWHOMEHELP)){
mTipQueue.offer(SHOWHOMEHELP);
}
3、在消息结束之后进行监听,若是Dialog 则在按钮触发时监听,若是popupWindow,则在onDismis时进行监听,如果当前队列队头是是当前处理消息,则出队,并通知观察者。
if (!mTipQueue.isEmpty() && mTipQueue.peek().equals(SHOWHOMEHELP)) {
mTipQueue.poll();
MainQueueDataChange.getInstance().notifyDataChange(null);
}
4、观察者的实现类,获得队头消息(peek,只读不取,在消息队列结束后才出队,如步骤3),发送给handler进行处理。
private MainQueueDataWatcher watcher = new MainQueueDataWatcher() {
@Override
public void update(Observable observable, Object data) {
super.update(observable, data);
//观察者接受到被观察者的通知,来更新自己的数据操作。
Message msg = Message.obtain();
msg.obj = mTipQueue.peek();
msg.setTarget(mHandler);
mHandler.sendMessage(msg);
}
};
5、Handler中对消息进行分发
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String s = mTipQueue.peek();
if (TextUtils.isEmpty(s)) {
return;
}
if (s.equals(SHOWHOMEHELP)) {
//首页蒙层
showHomeHelp();
} else if (s.equals(GRANTPERMISSION)) {//权限框
grantPermission();
} else if (s.equals(HINTTOAUTH)) {
//首页dialog
hintToAuth();
}
}
};
6、最后不要忘记解注册哦
MainQueueDataChange.getInstance().deleteObserver(watcher);
这样首页消息队列就可以有序的出队啦~~~