Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Introdurre ritardo in attesa di lista contatti con stato

    Allora, sto realizzando un semplice client jabber in java usando la libreria SMACK ma ho trovato un problemino...

    Il codice è questo:

    Codice PHP:
            connection = new XMPPConnection(data.getServer());
            
    connection.connect();
                    
            
    connection.login(data.getUsername(), data.getPassword());
            
            
            
    roster connection.getRoster(); // ottengo la lista contatti 
            
            
    System.out.println("numero utenti: " roster.getEntryCount());
                 
       
    // itero i singoli utenti
            
    Iterator<RosterEntryiter roster.getEntries().iterator();
            while (
    iter.hasNext())
            {
                
    RosterEntry entry = (RosterEntryiter.next();
                
                
    String user entry.getUser();
                
    Presence presence roster.getPresence(user);
                
                if (
    presence.isAvailable())
                {
                    
    System.out.println(user " e' online");
                }
                else
                {
                    
                    
    System.out.println(user " e' offline");
                }
            } 
    Dopo il login ottengo la lista contatti e controllo uno per uno lo stato. Il problema è che la lista la ottengo subito mentre lo stato arriva dopo!

    Mi spiego meglio: con questo codice i contatti jabber li vedo TUTTI OFFLINE (anche se non è vero). Se pero' metto 4 o 5 secondi di sleep subito dopo "roster = connection.getRoster();" i contatti online vengono visti correttamente.

    Ora. Come posso fare per "bloccare" il programma mentre aspetto che tutti gli stati dei contatti vengano rilevati correttamente?
    Nella libreria smack non trovo nulla

    Grazie 1000

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Se il tuo scopo e' quello di avere la lista dei client connessi, puoi anche mettere una sleep. Quando andrai a fare un client piu' funzionale per l'Istant Messanging, questo dovra' aggiorna in automatico gli stati (cioe' se l'utente Pippo e' offline, si connette dopo 2 minuti, tu dopo 2 minuti devi vedere che e' passato in stato online). In quel caso non ti porrai il problema perche' appena i contatti risulteranno online, tu vedrai il cambiamento di stato (credo che i programmi di IM funzionino piu' o meno cosi').

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da simo7784
    Se il tuo scopo e' quello di avere la lista dei client connessi, puoi anche mettere una sleep. Quando andrai a fare un client piu' funzionale per l'Istant Messanging, questo dovra' aggiorna in automatico gli stati (cioe' se l'utente Pippo e' offline, si connette dopo 2 minuti, tu dopo 2 minuti devi vedere che e' passato in stato online). In quel caso non ti porrai il problema perche' appena i contatti risulteranno online, tu vedrai il cambiamento di stato (credo che i programmi di IM funzionino piu' o meno cosi').
    Intanto grazie di aver risposto.

    Il problema è che non so quanto durera' l'ottenimento della lista contatti... A volte ci mette 2 secondi, altre volte 10, altre ancora dopo 30 secondi non e' ancora arrivata. Non posso quindi mettere una sleep che vada bene sempre! Ho provato ad usare un RosterListener intercettando l'evento presenceChanged:


    Codice PHP:
    public void presenceChanged(Presence presence)
                {
                    
    // The presence status of this user has changed
                    
                    
    String from presence.getFrom();
                    
                    
    System.out.println("******* user = " from " is " presence);
                    
                    
    JabberEntry je = new JabberEntry(from);
                    
                    if (
    presence.isAvailable())
                    {
                        
    available.add(je);
                    }
                    else
                    {
                        
    unavailable.add(je);
                    }
                    
                    
    Main.gui.updateContactList(availableunavailable);
                } 
    Cosi' facendo risolvo parzialmente il problema. Infatti in available e unavailable (sono 2 TreeSet, il primo raccoglie i contatti online, l'altro quelli offline) mi trovo dei doppioni che non dovrebbero esserci:



Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.