Handler暂停接收Message的实现

Handler暂停接收Message的实现

最近在做即时通信软件实现一个聊天的小功能,遇到了一个小问题:好友列表界面不在前台时如何更新。因为有好友上下线或者好友发来消息时需要更新好友列表界面,如果好友列表界面处于可交互状态比较好说,直接用handler更新界面即可,但是毕竟是通信软件,在和好友聊天时其他好友上下线或者发来消息是难免的,但是这时会有个问题,就是当前好友列表处于不可交互状态,不能直接更新,后来在论坛看见一个方法,记录一下。

大体思路是:当Activity调用onPause()时,将需要处理的message 暂存 一下,当Activity调用onResume()恢复时,将暂存的消息取出,重新发送给handler执行操作。

下面是实现暂存功能的Handler类:

public abstract class PauseHandler extends Handler {

    /**
     * 储存还未处理的消息
     */
    final Vector<Message> messageQueueBuffer = new Vector<Message>();

    /**
     * 标志位,记录创建handler的控件是否可操作
     */
    private boolean paused;

    /**
     * 恢复,重新发送临时储存的消息
     */
    final public void resume() {
        paused = false;

        while (messageQueueBuffer.size() > 0) {
            final Message msg = messageQueueBuffer.elementAt(0);
            messageQueueBuffer.removeElementAt(0);
            sendMessage(msg);
        }
    }

    /**
     * 暂停操作
     */
    final public void pause() {
        paused = true;
    }

    /**
     *通知消息即将被保存为活动暂停。如果没有处理,当活动恢复时,消息将被保存并重播。
     *
     * @param message 需要储存的消息
     * @return 消息是否储存成功
     */
    protected abstract boolean storeMessage(Message message);

    /**
     * 对需要处理的消息执行相应的操作
     *
     * @param message 需要执行的消息
     */
    protected abstract void processMessage(Message message);

    /** {@inheritDoc} */
    @Override
    final public void handleMessage(Message msg) {
        if (paused) {
            if (storeMessage(msg)) {
                Message msgCopy = new Message();
                msgCopy.copyFrom(msg);
                messageQueueBuffer.add(msgCopy);
            }
        } else {
            processMessage(msg);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_30496695/article/details/72984344