Autore Topic: list refresha da una void ma non da un'altra  (Letto 458 volte)

Offline ewix

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S5830
  • Sistema operativo:
    ubuntu 12.04 - Windows 7
list refresha da una void ma non da un'altra
« il: 08 Settembre 2012, 17:05:30 CEST »
0
0 down vote favorite
   

la cosa è abbastanza strana: nel progetto (ricavato da Yaxim, quindi una chat xmpp), sto cercando di implementare la notifica di scrittura tramite il messageeventlistener. Ricevo correttamente l'evento di notifica. Per farlo apparire nella listview (che si trova in una classe separata) aggiungo una riga al database, esattamente come se fosse un messaggio (solo che il testo lo imposto io ed è "..."). Ho aggiunto un contatore di verifica e la riga viene correttamente aggiunta al db (successivamente la riga viene eliminata dal db quando il messaggio reale arriva). Anche il richiamo a notifychanges è a posto dopo l'insert. Nonostante tutto la riga non compare nella listview. Se sposto la procedura poche righe più sotto, nel packetlistener per i regolari messaggi di chat, la riga viene invece inserita. Però non posso lasciare lì la procedura perchè il packetlistener non reagisce sempre alle notifiche di scrittura. Inoltre, mentre la notifica viene inserita correttamente a db, se mantengo la procedura nel messageEventNotificationListener() il messaggio di notifica non viene eliminato quando il messaggio reale arriva (ed il contatore infatti continua ad incrementare); se risposto la procedura nel packetListener invece si (quindi iCount va a  0 dopo che il messaggio è stato inserito nel db)

Questo è il messageeventlistener:

Codice (Java): [Seleziona]
private void messageEventNotificationListener(){
    // Create a MessageEventManager
    if (mMessageEventManager == null)
        mMessageEventManager = new MessageEventManager(mXMPPConnection);
      // Add the listener that will react to the event notifications
    mMessageEventManager.addMessageEventNotificationListener(new MessageEventNotificationListener() {
          public void deliveredNotification(String from, String packetID) {
              Log.d(TAG, "The message has been delivered (" + from + ", " + packetID + ")");
          }

          public void displayedNotification(String from, String packetID) {
              Log.d(TAG, "The message has been displayed (" + from + ", " + packetID + ")");
          }

          public void composingNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is composing a reply (" + from + ", " + packetID + ")");
              //controlla se l'utente non sta già scrivendo
              String selection = ChatConstants.JID + " = '" + from + "' AND " +
                        ChatConstants.DELIVERY_STATUS + " = " + ChatConstants.DS_WRITING;

                Cursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI,
                            new String[] { "count(" + ChatConstants._ID + ")" },
                            selection, null, null);
                cursor.moveToFirst();
                int iCount = cursor.getInt(0);
                //if (iCount == 0)
                //{
                    addChatMessageToDB(ChatConstants.INCOMING, from, "...", ChatConstants.DS_WRITING, System.currentTimeMillis(), packetID);

                //}

          }

          public void offlineNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is offline (" + from + ", " + packetID + ")");
          }

          public void cancelledNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver cancelled composing a reply (" + from + ", " + packetID + ")");


          }
      });  

}

e qui c'è il  packetlistener:

Codice (Java): [Seleziona]
private void registerMessageListener() {
    // do not register multiple packet listeners
    if (mPacketListener != null)
        mXMPPConnection.removePacketListener(mPacketListener);

    PacketTypeFilter filter = new PacketTypeFilter(Message.class);

    mPacketListener = new PacketListener() {
        public void processPacket(Packet packet) {
            try {
            if (packet instanceof Message) {
                Message msg = (Message) packet;
                String chatMessage = msg.getBody();

                DeliveryReceipt dr = (DeliveryReceipt)msg.getExtension("received", DeliveryReceipt.NAMESPACE);
                if (dr != null) {
                    Log.d(TAG, "got delivery receipt for " + dr.getId());
                    changeMessageDeliveryStatus(dr.getId(), ChatConstants.DS_DELIVERED);
                }


                if (chatMessage == null)
                    return;

                if (msg.getType() == Message.Type.error) {
                    chatMessage = "<Error> " + chatMessage;
                }

                long ts;
                DelayInfo timestamp = (DelayInfo)msg.getExtension("delay", "urn:xmpp:delay");
                if (timestamp == null)
                    timestamp = (DelayInfo)msg.getExtension("x", "jabber:x:delay");
                if (timestamp != null)
                    ts = timestamp.getStamp().getTime();
                else
                    ts = System.currentTimeMillis();

                String fromJID = getJabberID(msg.getFrom());

                //elimina il messaggio "writing" se esiste
                     deleteWritingChatMessageFromDB(fromJID);

                    if (msg.getExtension("request", DeliveryReceipt.NAMESPACE) != null) {
                        // got XEP-0184 request, send receipt
                        sendReceipt(msg.getFrom(), msg.getPacketID());
                    }

                    addChatMessageToDB(ChatConstants.INCOMING, fromJID, chatMessage, ChatConstants.DS_NEW, ts, msg.getPacketID());
                    mServiceCallBack.newMessage(fromJID, chatMessage);
                }
            }
            } catch (Exception e) {
                // SMACK silently discards exceptions dropped from processPacket :(
                Log.e(TAG, "failed to process packet:");
                e.printStackTrace();
            }

    };

    mXMPPConnection.addPacketListener(mPacketListener, filter);
}

e per ultimi i metodi di insert e delete

Codice (Java): [Seleziona]
private void addChatMessageToDB(int direction, String JID,
        String message, int delivery_status, long ts, String packetID) {
    ContentValues values = new ContentValues();

    values.put(ChatConstants.DIRECTION, direction);
    values.put(ChatConstants.JID, JID);
    values.put(ChatConstants.MESSAGE, message);
    values.put(ChatConstants.DELIVERY_STATUS, delivery_status);
    values.put(ChatConstants.DATE, ts);
    values.put(ChatConstants.PACKET_ID, packetID);

    Uri noteUri = mContentResolver.insert(ChatProvider.CONTENT_URI, values);
    //mContentResolver.notifyChange(noteUri, null);
}

private void deleteWritingChatMessageFromDB(String JID) {
    int count = mContentResolver.delete(ChatProvider.CONTENT_URI,
            ChatConstants.JID + " = ? AND " + ChatConstants.MESSAGE + " = ? AND " + ChatConstants.DELIVERY_STATUS + " = ?", new String[] { JID, "...", "3" });
    debugLog("deleteWritingChatMessageEntryFromDB: Deleted " + count + " entries");

}

entrambi i metodi vengono richiamati dalla classe ChatProvider e finiscono con getContext().getContentResolver().notifyChange(url, null);