【问题标题】:Java: Extend functionality of listener method from another classJava:从另一个类扩展侦听器方法的功能
【发布时间】:2016-05-07 05:58:40
【问题描述】:

我想为所有 smack 的基本方法(如连接、登录、发送消息、接收消息)创建一个单独的类。

所以,有一个监听器方法来接收消息。

static ChatManagerListener chatManagerListener = new ChatManagerListener() {
        @Override
        public void chatCreated(Chat chat, boolean createdLocally) {
            chat.addMessageListener(
                    new ChatMessageListener() {
                        @Override
                        public void processMessage(Chat chat, Message message) {
                            System.out.println("MESSAGE RECEIVED: "+message.toString());
                            messageReceived(message);
                        }
                    });
        }
    };

消息被接收并传递给 messageReceived() 方法。

情况:

现在,当我将这个类导入其他类时,我想扩展这个 messageReceived() 方法的功能,因此整个过程仍然是抽象的,开发人员只处理传入的消息。或者,这个 messageReceived() 方法以某种方式将消息推送到其他类。

【问题讨论】:

  • 你能改变 ChatManagerListener 吗?在这里使用工厂(例如)将是一个直接的实现。 (另外,你能把它改成 ChatListenerManager 吗?哈哈)

标签: java inheritance xmpp smack


【解决方案1】:

基本上你需要定义另一个监听器来管理消息。

这是一个有效的 sn-p 示例(原型,因此它很丑陋且没有任何模式)用于更新接收者用户的 GUI。

如果您需要其他东西,请记住,您需要服务器端的插件 (PacketInterceptor)。

/*MessageGuiUpdate.java*/
    public interface MessageGuiUpdate {

        public void displayMessage(String body);
    }



/*XmppManager.java*/
public void init() throws XMPPException, SmackException, IOException {
private MessageGuiUpdate guiUpdate;
 //FOO
 //BAR

/* init() */
        this.chatManager = ChatManager.getInstanceFor(connection);


        this.chatManager.addChatListener(
                new ChatManagerListener() {
                    @Override
                    public void chatCreated(Chat chat, boolean createdLocally)
                    {
                        if (!createdLocally)
                        {

                            chat.addMessageListener(new IncomingMessageListener());;
                        }
                    }
                });
}

/*nested class*/
    class IncomingMessageListener implements ChatMessageListener {
        @Override
        public void processMessage(Chat arg0, Message message) {
            String from = message.getFrom();
            String body = message.getBody();

            if (body != null)
            {
            System.out.println(String.format("============ Received message '%1$s' from %2$s\n============", body, from));
            guiUpdate.displayMessage(body);
            }

        }

    }

/*CustomGui.java*/
public class CustomGui implements MessageGuiUpdate {
//foo

@Override
public void displayMessage(String message) {
    System.out.println("I've just recived: "+message);

}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多