J'écris une application de messagerie basée sur XMPP pour Android à l'aide de l'API Smack.Architecture correcte pour l'application de messagerie basée sur XMPP à l'aide de l'API Smack
J'ai une classe Application qui contient toutes les fonctions liées à XMPP (telles que se connecter, envoyer un message, écouter des messages, invitations, présence, etc.). J'ai mis tous les écouteurs dans une fonction séparée (startAllListeners) qui est appelée à partir de mon écran de démarrage lorsque l'application démarre. Je ne suis pas sûr de l'architecture à utiliser pour optimiser les performances de l'application. Parfois, je reçois les 250 images ont été ignorées info dans mon journal. Je suppose que c'est plus une question multithreading qu'une question XMPP. J'ai vu des exemples de code où certaines personnes ont créé un service d'arrière-plan séparé qui gère tous les auditeurs. J'ai aussi vu du code où les auditeurs sont étroitement liés à des activités (ce que je suis un peu mal à l'aise). Donc, ma question est, Quelle est la bonne façon d'organiser toutes les fonctions xmpp et quel est le bon endroit pour mettre tous les auditeurs.
Ma classe d'application ressemble à ceci:
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();
}
}