Autore Topic: Polling file sulla rete  (Letto 1086 volte)

Offline vsibilla

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Arkos 70 Internet Tablet
  • Play Store ID:
    Vuesse
  • Sistema operativo:
    Mac OS X 10.6
Polling file sulla rete
« il: 28 Marzo 2011, 22:17:45 CEST »
0
Ciao a tutti,

vorrei migliorare le performance di un polling di un file xml su rete, in quanto temporizzando la lettura ogni 2 sec l'interfaccia utente risulta poco reattiva.

Avete un consiglio da darmi? secondo voi è possibile gestire con un thread asincrono il polling, assegnando una low priority?

PS Il polling è su un file con i metadati di un server shoutcast. Oltre alle solite informazioni embeddate nel flusso, ho implementato un protocollo di comandi attraverso il quale riesco a pilotare i device in ascolto.
Grazie a tutti!
Valerio

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Polling file sulla rete
« Risposta #1 il: 28 Marzo 2011, 22:31:11 CEST »
0
DEVI gestire il tutto in un thread separato :)

Sent from my HTC Desire

Offline vsibilla

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Arkos 70 Internet Tablet
  • Play Store ID:
    Vuesse
  • Sistema operativo:
    Mac OS X 10.6
Re:Polling file sulla rete
« Risposta #2 il: 28 Marzo 2011, 23:06:03 CEST »
0
ciao Ricky,
grazie come al solito per le tue celeri risposte.

Ho provato ad istanziare un thread separato con il processo di polling, ma non ho riscontrato miglioramenti.
Se non ricordo male istanziare un nuovo thread non significa creare un nuovo processo, ma solo gestire un thread differente nello stesso processo. Tu cosa mi consigli?

Valerio

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Polling file sulla rete
« Risposta #3 il: 29 Marzo 2011, 08:02:35 CEST »
0
Ho provato ad istanziare un thread separato con il processo di polling, ma non ho riscontrato miglioramenti.

Ma il polling con quanto dura e ogni quanto lo fai?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline vsibilla

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Arkos 70 Internet Tablet
  • Play Store ID:
    Vuesse
  • Sistema operativo:
    Mac OS X 10.6
Re:Polling file sulla rete
« Risposta #4 il: 29 Marzo 2011, 08:35:42 CEST »
0
Il file è un xml con 5 elementi, mentre il polling lo vorrei fare ogni secondo (devo aggiornare il titolo e l'artista di un flusso streaming)...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Polling file sulla rete
« Risposta #5 il: 29 Marzo 2011, 09:17:59 CEST »
0
Strano che l'interfaccia sia rallentata se la chiamata http è in un thread separato. Hai messo nel thread anche il parsing xml?  Prova a postare lo scheletro del codice :)

Sent from my HTC Desire

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re: Polling file sulla rete
« Risposta #6 il: 29 Marzo 2011, 09:22:33 CEST »
0
Strano che l'interfaccia sia rallentata se la chiamata http è in un thread separato. Hai messo nel thread anche il parsing xml? 

Infatti è molto strano. L'unica spiegazione che mi ero dato è che il thread per qualche ragione (ma senza vedere il codice è impossibile accertarsene) monopolizzasse la CPU.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline vsibilla

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Arkos 70 Internet Tablet
  • Play Store ID:
    Vuesse
  • Sistema operativo:
    Mac OS X 10.6
Re:Polling file sulla rete
« Risposta #7 il: 29 Marzo 2011, 10:02:55 CEST »
0
Ecco il codice:

Codice (Java): [Seleziona]
                updateMetadata = new TimerTask(){
                                @Override
                                public void run() {
                                        handlerMetadata.post(new Runnable(){
                                                public void run(){
                                                        metadata = GlobalParser.readMetadata(urlMetadataSelected);
                                                        updateUIMetadata();
                                                }
                                        });
                                }};
                tMetadata.schedule(updateMetadata, 300,TIME_UPDATE_METADATA);

che richiama il metodo statico della classe GlobalParser:

Codice (Java): [Seleziona]
        public static Metadata readMetadata (String urlMetadataSelected) {
                try {
                        Log.d(LOG_TAG,"readMetadata");
                       
                        // Gestione XML
                        SAXParserFactory spf = SAXParserFactory.newInstance();         
                        SAXParser sp = spf.newSAXParser();                                                     
                        XMLReader xr = sp.getXMLReader();                                                      

                        if (urlMetadataSelected != "") {
                                URL sourceUrl = new URL(urlMetadataSelected);  

                                MetadataHandler metadataHandler = new MetadataHandler();               
                                xr.setContentHandler(metadataHandler);                                                 
                                xr.parse(new InputSource(sourceUrl.openStream()));                             
                               
                                return MetadataHandler.metadata;                                       
                        }
                       
                        return null;
                       
                } catch (Exception e) {
                        Log.e(LOG_TAG,"readMetadata Exception: " + e);
                        return null;
                }
        }

ed infine il metodo che aggiorna l'interfaccia utente

Codice (Java): [Seleziona]
    private void updateUIMetadata() {
       
        if (metadata != null) {
                txtArtista = (TextView)findViewById(R.id.label_artista);
                txtArtista.setText(metadata.getArtista());
                txtTitolo = (TextView)findViewById(R.id.label_titolo);
                txtTitolo.setText(metadata.getTitolo());
                txtNomeRadio = (TextView)findViewById(R.id.label_nome_radio);
                txtNomeRadio.setText(metadata.getNomeRadio());
                txtGenereRadio = (TextView)findViewById(R.id.label_genere_radio);
                txtGenereRadio.setText(metadata.getGenereRadio());
                txtClaimRadio = (TextView)findViewById(R.id.label_claim_radio);
                txtClaimRadio.setText(metadata.getClaimRadio());
        }
    }

voi cosa ne pensate?


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Polling file sulla rete
« Risposta #8 il: 29 Marzo 2011, 10:21:23 CEST »
0
Ammetto di non aver mai usato TimerTask, per cui potrei sbagliarmi, ma da quello che capisco il fetch dei dati, il parsing e l'update della UI (per quanto riguarda i dati ottenuti) avviene tutto nel medesimo thread (non nel main thread comunque).

Comunque, per UI poco reattiva intendi quella di tutto il programma oppure solo i dati che il tuo thread separato ti aggiorna?
« Ultima modifica: 29 Marzo 2011, 10:23:45 CEST da bradipao »
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Polling file sulla rete
« Risposta #9 il: 29 Marzo 2011, 12:03:05 CEST »
+1
secondo me, al 99% è tutto nel thread UI.
Prova a fare un asynctask dentro al timertask, in cui fai il download/parsing dei dati. Poi nella onPostExecute dell'asyncTask richiami la tua updateUI...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline vsibilla

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Arkos 70 Internet Tablet
  • Play Store ID:
    Vuesse
  • Sistema operativo:
    Mac OS X 10.6
Re:Polling file sulla rete
« Risposta #10 il: 29 Marzo 2011, 13:12:27 CEST »
0
Grazie Nicola_D, ci provo e poi vi faccio sapere...
Valerio