2013-08-30 15 views
5

Questi due metodi in mi stanno confondendo al momento e sembra che sia molto facile utilizzarli in modo errato.Come vengono utilizzati correttamente i metodi publish() e process() su SwingWorker?

Il metodo publish() descrive quanto segue:

invia blocchi di dati al metodo processo (java.util.List). Questo metodo deve essere utilizzato all'interno del metodo doInBackground per fornire risultati intermedi per l'elaborazione nel thread di invio eventi all'interno del metodo di processo.

Che cosa questo significa per me è che mentre il mio thread di lavoro sta eseguendo il suo metodo doInBackground(), sono in grado di creare "pezzi" (dovrebbe questi essere qualcosa di specifico o è solo un modo per fare riferimento a oggetti inclusi nei messaggi?) , quindi pubblicali per l'elaborazione sulla mia GUI Swing.

Questo mi porta a process(). Javadoc delinea quanto segue:

Riceve i blocchi di dati dal metodo di pubblicazione in modo asincrono sul thread di invio eventi.

Dopo aver esaminato la documentazione per entrambi i metodi, qualcuno potrebbe chiarire qual è il meccanismo dietro a come questo sta avvenendo? Capisco che si tratta di un processo asincrono come da documentazione, ma dal momento che sta avvenendo sull'EDT, sto immaginando che ci sia una certa prevedibilità ad esso.

I publish() stati di documentazione questo:

Poiché il metodo di processo viene richiamato in modo asincrono sull'evento spedizione discussione più invocazioni al metodo di pubblicazione potrebbe verificarsi prima dell'esecuzione del metodo di processo. A fini di prestazioni, tutte queste invocazioni sono raggruppate in un'unica invocazione con argomenti concatenati.

Per riassumere, la mia domanda è duplice:

  • Chi dovrebbe essere chiamata process()?
  • Qual è il flusso di lavoro per process() nel contesto di SwingWorker e EDT?

Per favore fatemi sapere se sono necessari chiarimenti.

+2

'process()' è un callback. Non è necessario chiamarlo. 'process()' è chiamato in EDT dalla libreria. – johnchen902

risposta

3

Ho scritto un programma che elabora le directory in una sottostruttura. L'elaborazione richiede abbastanza tempo che l'utente abbia bisogno di feedback sul fatto che qualcosa stia succedendo. Ho creato una finestra di dialogo che contiene un'etichetta con il nome della sottodirectory attualmente in fase di elaborazione; il thread di swingworker ha chiamato publish() con il nome di ogni directory in elaborazione.

Non è possibile garantire che l'interfaccia utente venga aggiornata per ciascun nome di directory, a volte l'elaborazione va più veloce rispetto alla visualizzazione, soprattutto se sul computer si verifica qualsiasi altra cosa e in base al computer su cui vengono eseguite le operazioni. Quindi publish() potrebbe essere chiamato ed eseguito più volte senza che process() venga chiamato dal runtime di Swing.

Come già sottolineato, il processo non viene chiamato dal codice: viene richiamato per conto dell'utente dopo aver chiamato la pubblicazione, e forse non tutte le volte che si chiama publish().

Questo chiarisce le cose per voi?

+0

Quindi, ciò che la pubblicazione sta effettivamente facendo è mettere i suoi blocchi in una specie di coda che il processo sta acquisendo ogni volta che EDT lo chiama .. è questo il modo corretto di guardarlo? – Surveon

+2

sì, e il runtime di Swing (non proprio il thread) fa qualcosa con tutti i blocchi accumulati tutti in una volta, se ce n'è più di uno. – arcy

3

È necessario chiamare publish() per aggiungere dati da elaborare con il metodo process().

Il metodo di pubblicazione può essere chiamato da qualsiasi thread.

Il metodo di processo viene eseguito all'interno del thread EDT in modo che sia possibile modificare le informazioni della GUI consentite solo dal thread EDT, quindi non è necessario chiamare il metodo process().

Spetta a te decidere cosa deve fare il tuo process(), ma ricorda che è in esecuzione nel thread EDT, quindi dovrebbe terminare molto rapidamente.

Problemi correlati