2015-08-20 1 views
3

Я пишу приложение для чата на базе 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(); 
} 

}

ответ

0

Прежде всего, лучший способ для меня является то, что подходит, с точки зрения производительности, другие могут пойти на дизайн-макета или что-то еще - (btw, я не гений или гуру).

Итак, если бы я должен был сделать что-то подобное, я бы поставил всех слушателей в Службу, вероятно, сломал каждого слушателя Службе; это может зависеть от того, как ваш архитектор вашего приложения, так как вы можете нажимать сообщения, когда пользователь отключен, чтобы уведомить их, и вам также придется подключаться к вашим серверам или другим подключиться, отправлять сообщения, слушать сообщения, приглашения, присутствие и т. д., если все, что нужно на одной службе, хорошо, что Служба должна жить вечно, если вы разделите их, вы экономите ресурсы и время или продуктивно, что происходит с отзывчивостью. В любом случае это зависит только от того, как вы разрабатываете свои приложения, поэтому выбирайте структуру дизайна и выбирайте способ перехода.

Как и известная практика - трудные задания уходят на задний план IntentService или Thread и элементы UI на главной теме. Разделение сил помогает определить, кто является боссом и кто несет ответственность за то, что легче, и это проще для точки пинга.

Смежные вопросы