2015-08-20 1 views
3

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(); 
} 

}

Répondre

0

D'abord, la meilleure façon pour moi est ce qui convient, en termes de performance, d'autres seront peut-être pour la mise en page de conception ou quelque chose d'autre - (btw, je ne suis aucun génie ou gourou)

Ainsi si je devais faire quelque chose comme ceci je placerais tous les écouteurs dans un service décomposent probablement chaque auditeur en service; Cela peut dépendre de la façon dont votre architecte votre application, comme vous pouvez pousser les messages lorsque l'utilisateur est hors ligne pour les informer, et vous devrez également vous connecter à vos serveurs ou autres se connecter, envoyer un message, écouter les messages, invitations, présence etc, si tout ce qui doit être sur un service bien, ce service doit vivre éternellement, si vous les divisez, vous économisez des ressources et du temps ou productivement, ce qui va de pair avec la réactivité. De toute façon dépend uniquement de la façon dont vous concevez vos applications, afin de choisir une structure de conception et de choisir la voie à suivre ..

Comme la pratique connue - emploi dur va à l'arrière-plan IntentService ou Thread et d'autres choses de l'interface utilisateur sur le thread principal. Séparation des pouvoirs permet d'identifier qui est le patron et qui est responsable de quoi, et il est plus facile de pointer du doigt.