Я пишу приложение для чата на базе XMPP для Android с помощью API Smack.Правильная архитектура приложения для обмена сообщениями на основе XMPP с использованием API Smack
У меня есть класс приложения, который содержит все связанные с XMPP функции (такие как подключение, отправка сообщения, прослушивание сообщений, приглашений, наличие и т. Д.). Я поместил всех слушателей в отдельную функцию (startAllListeners), которая вызывается из моего заставки при запуске приложения. Я не знаю, как использовать архитектуру для оптимизации производительности приложения. Иногда я получаю 250 кадров, пропущенных информации в моем журнале. Я предполагаю, что это вопрос многопоточности, а не вопрос XMPP. Я видел примеры кода, где некоторые люди создали отдельную справочную службу, которая обрабатывает всех слушателей. Я также видел некоторый код, где слушатели тесно связаны с действиями (что мне немного неудобно делать). Итак, мой вопрос: Каков правильный способ организации всех функций xmpp и правильное место для размещения всех слушателей.
Мой класс Application выглядит следующим образом:
public class MyApplication extends Application {
public synchronized static MyApplication getInstance() {}
public void onTerminate() {}
public static XMPPTCPConnection getConnection() {}
public boolean connectToXMPP(final String username, final String password) {}
public static boolean ifUserExist(String username){}
public static void sendMessage(String message, String roomUniqueId){}
public MultiUserChat createRoom(String roomname, String roomdesc) throws Exception {}
public void joinRoom(MultiUserChat muc){}
public void inviteToRoom(MultiUserChat muc, String inviteeJID){}
public List<String> getRoomOccupants(String roomName)throws XMPPException {}
public boolean destroyMUC(MultiUserChat muc) {}
public boolean bookmarkRoom(String roomId){}
public List<BookmarkedConference> getBookmarkedRooms(){}
public void startAllListeners(){
AsyncTask<Void, Void, Boolean> backgroundThread= new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
StanzaTypeFilter message_filter = new StanzaTypeFilter(Message.class);
StanzaTypeFilter presence_filter = new StanzaTypeFilter(Presence.class);
connection.addAsyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
Message message = (Message) packet;
Log.e(TAG, "Packet contents are " + packet.toString());
}
}, message_filter);
connection.addAsyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
Presence presence = (Presence) packet;
Log.e(TAG, "Packet contents are " + packet.toString());
Log.e(TAG, "Presence update from " + presence.getFrom());
}
}, presence_filter);
PacketCollector messageCollector = connection.createPacketCollector(message_filter);
PacketCollector presenceCollector = connection.createPacketCollector(presence_filter);
manager = MultiUserChatManager.getInstanceFor(connection);
manager.addInvitationListener(new InvitationListener() {
@Override
public void invitationReceived(XMPPConnection conn, MultiUserChat room, String inviter, String reason, String password, Message message) {
Log.e("Invitation received", "Got an invitation from " + inviter);
try {
room.join(getUsername());
} catch (Exception e) {
e.printStackTrace();
}
}
});
try {
Presence presence = new Presence(Presence.Type.available);
connection.sendStanza(presence);
Log.e(TAG, "Logged In as " + connection.getUser());
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
};
backgroundThread.execute();
}
}