美文网首页
android 首页消息队列

android 首页消息队列

作者: 貌似很有道理呢 | 来源:发表于2017-09-01 11:09 被阅读850次

打开应用时,往往会存在许多消息要与用户进行交互,入更新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);

这样首页消息队列就可以有序的出队啦~~~

相关文章

网友评论

      本文标题:android 首页消息队列

      本文链接:https://www.haomeiwen.com/subject/ugvhjxtx.html