2

メソッドのリスナーを実装するのに本当に苦労しています。

現在の作業では、新しい情報を確認するために5秒ごとにメソッドをリクエストする必要があるため、新しい情報が来るたびに通知するメソッドを実装して、リクエストしたメソッドを5秒ごとに破棄します。

(私はすでにオブザーバーパターンについて読みましたが、実装に成功しませんでした。)

よろしくお願いします

詳細:今のところ、新しいメッセージをmsgsキューに保存するために、smackXMPPライブラリからこのメソッドをオーバーライドします。

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

OK、なんとか問題を解決できました。

オブザーバーモデルに基づいてリスナーを実装しました。そのために、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 に答える