Сообщение получено два раза в библиотеке xmpp smack

#android #xmpp #openfire #asmack

#Android #xmpp #openfire #asmack

Вопрос:

Я создаю приложение для чата Android с использованием библиотеки xmpp smack.Я создал фоновую службу для прослушивания входящих чатов и использую класс приложения для инициализации объекта подключения xmpp. Проблема в том, что созданная в чате функция прослушивателя чата вызывается дважды, поэтому отображается дублирующее сообщение.. Это мой класс приложения, в котором я создал соединение

Authenticate.java

 public class Authenticate extends Application {

    private static final String DOMAIN = StaticVariables.chatServer;
    private static final String HOST = StaticVariables.chatServer;
    private static final int PORT = 5222;
    static AbstractXMPPConnection connection ;
    String username,password;
    private boolean connected;

    @Override
    public void onCreate() {
        super.onCreate();

    }

    public AbstractXMPPConnection initializeXMPPTCPConnection(String username,String password) {
        Log.e("APPLICATION", "username: " username);
        Log.e("APPLICATION", "password: " password);
        Log.i("APPLCATION", "initializeXMPPTCPConnection calle:");
        this.username=username;
        this.password=password;
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword(username, password);
        configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        configBuilder.setResource("Android");
        configBuilder.setServiceName(DOMAIN);
        configBuilder.setHost(HOST);
        configBuilder.setPort(PORT);
        configBuilder.setDebuggerEnabled(true);
        connection = new XMPPTCPConnection(configBuilder.build());
        connection=connectConnection();
        Log.e("APPLICATION", "initializeXMPPTCPConnection: " connection.isConnected());
        return connection;
    }

    public AbstractXMPPConnection getConnection(){
        return connection;
    }

    public AbstractXMPPConnection connectConnection()
    {
        AsyncTask<Void, Void, AbstractXMPPConnection> connectionThread = new AsyncTask<Void, Void, AbstractXMPPConnection>() {

            @Override
            protected AbstractXMPPConnection doInBackground(Void... arg0) {

                // Create a connection
                try {
                    connection.connect().login();
                    Log.e("Application", "doInBackground: " connection.isConnected());
                    //login();
                    connected = true;
                    //sendMsg();

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (SmackException e) {
                    e.printStackTrace();
                } catch (XMPPException e) {
                    e.printStackTrace();
                }

                return connection;
            }

            @Override
            protected void onPostExecute(AbstractXMPPConnection connection2) {
                super.onPostExecute(connection2);
//                sendMsg(message.getText().toString());
                Log.e("APPLICATION", "onPostExecute: " connection2.isConnected());
                connection=connection2;
            }
        };
        try {
            connection=connectionThread.execute().get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        Log.e("Application", "connectConnection: " connection.isConnected());
        return connection;
    }

    public void login() {

        try {
            connection.login(username, password);
            Log.e("APPLICATIPN", "Yey! We're connected to the Xmpp server!");

        } catch (XMPPException | SmackException | IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
        }

    }



}
 

Это код, с помощью которого я вызываю экземпляр соединения

 connection=((Authenticate)getApplication()).getConnection();
 

Функция прослушивания

 public void listenChat(String name){
            ChatManager manager = ChatManager.getInstanceFor(connection);
            manager.addChatListener(new ChatManagerListener() {

                @Override
                public void chatCreated(final Chat chat, boolean createdLocally) {
                    System.out.println("Created chat");
                    chat.addMessageListener(new ChatMessageListener() {

                        @Override
                        public void processMessage(final Chat chat, final org.jivesoftware.smack.packet.Message message) {
//This is called twice

                            }
                        }
                    });

                }
            });
        }
 

Я новичок в Android, а также в xmpp. Пожалуйста, скажите мне, где я ошибаюсь, как я могу это решить

Комментарии:

1. просто предложение, не помещайте свой основной логин в класс приложения. создайте отдельный синглтон. и где вызывается ваше connectConnection, listenChat и initializeXMPPConnection?

2. убедитесь, что сколько раз вызывался listenChat () этот метод, я думаю, он вызывается два раза так…

Ответ №1:

Вы должны исправить использование createdLocally в методе chatCreated.

Просто добавьте слушателя, если он не создан локально, как это:

 public void chatCreated(Chat chat, boolean createdLocally)
            {
                if (!createdLocally)
                {
                    chat.addMessageListener(new ChatMessageListener()...);
                }
            }