2

我在实现方法的侦听器时遇到了非常糟糕的时间。

在我目前的工作中,我必须每 5 秒请求一个方法以验证新信息,所以我想实现一个方法来通知我,每次有新信息出现时,每 5 秒丢弃一次请求方法。

(我已经阅读了观察者模式,但没有成功实施。)

最好的祝福

更多信息:现在我从 smack XMPP 库中重写此方法,以便将新消息存储在 msgs 队列中

public void processMessage(Chat chat, Message message) {
    if (message.getType() == Message.Type.chat) {
        req = message.getBody().toString();
        String[] temp = { chat.getParticipant().toString(), req };
        System.out.println(temp[0]+"says:"+temp[1]);
        synchronized (lock) {
            msgs.add(temp);
        }
    }
} 

而且我每 0.5 秒执行一次此方法以验证新消息:

public String[] getMessage() {
    synchronized (lock) {
        String[] data;
        data=msgs.poll();
        return data;
    }
}

我正在尝试设置一个通知系统,每次执行 processMessage 时都会通知我。

4

1 回答 1

8

好的,我设法解决了我的问题。

我实现了一个基于观察者模型的监听器。为此,我必须实现一个名为 XMPPmessageListener 的接口:

public interface XMPPmessageListener {
    public void readMsg(String senderJID, String msg); 
}

与 XmppHandler 类相比,方法 processMessage 和 getMessage 的类我添加了添加和删除侦听器的方法以及存储侦听器的 LinkedList:

private LinkedList<XMPPmessageListener> listeners = new LinkedList<XMPPmessageListener>();

public void addMsgListener(XMPPmessageListener listener){
    listeners.add(listener);
}

public boolean removeMsgListener(XMPPmessageListener listener){
    return listeners.remove(listener);
}       

为了警告听众,我在 processMessage 方法中做了一些交流:

public void processMessage(Chat chat, Message message) {
    if (message.getType() == Message.Type.chat) {
        for(XMPPmessageListener l: listeners){
            l.readMsg(chat.getParticipant().toString(), message.getBody().toString());
        }
    }
} 

现在,每次通过创建 XMPPmessageListener 接收消息时,我都可以在任何方法上收到通知,并通过覆盖 readMsg 方法来决定如何处理该消息:

XmppHandler xmpp = new XmppHandler(XMPPuser, XMPPpassword, XMPPaddress, XMPPdomain, XMPPport);

XMPPmessageListener msglistener = new XMPPmessageListener() {

                @Override
                public void readMsg(String senderJID, String msg) {
                    String asw=xmlHandler.processMsg(msg,senderJID);

                }
            };
            xmpp.addMsgListener(msglistener);
于 2012-08-27T14:12:58.573 回答