Autore Topic: Download di piu file da diversi URL, multithreading?  (Letto 1117 volte)

Offline Nicola_D

  • 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
Download di piu file da diversi URL, multithreading?
« il: 10 Novembre 2010, 00:29:33 CET »
0
Mi trovo ad aprire questo topic per chiedere piu un consiglio che del codice...
Ho un'applicazione che deve (a comando) scaricare dei dati attraverso 6 diversi url (appartenenti allo stesso server), li deve salvare in una stringa e parsarli (sono file JSON), quindi inserire il tutto in un database.
Ho fatto una prova con il piu "pesante" di questi 6 link e tutto funziona, ma ora ho una domanda:
Vorrei fare che dalla UI (o dall'evento dell'utente), parta la procedura per tutti e 6 i file, ma vorrei evitare di lanciare 6 thread di connessioni HTTP sullo stesso server,quindi vorrei capire, come agisco?
Creo una classe thread che lancia 6 thread (uno alla volta)?
esiste un modo di far eseguire n thread in successione, e poi restituire un risultato di OK all'UI (tramite Handler immagino).

Chiedo consiglio a voi, mi pare di aver letto che AsyncTask non è fatta per lanciare thread quindi sono in dubbio...
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 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Download di piu file da diversi URL, multithreading?
« Risposta #1 il: 10 Novembre 2010, 09:06:28 CET »
+1
Sono fuori per cui prendi con le pinze quello che dico.
Su un pc potresti utilizzare un threadpool al quale vanno aggiunti i thread che vuoi eseguire. Se setti la dimensione del pool ad 1, potrebbe fare al caso tuo. Ma non so se puoi fare questo con android.
Invece, nello specifico per android, il meccanismo degli handler/messages potrebbe fare al caso tuo.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Nicola_D

  • 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:Download di piu file da diversi URL, multithreading?
« Risposta #2 il: 10 Novembre 2010, 09:21:34 CET »
0
Sono fuori per cui prendi con le pinze quello che dico.
Su un pc potresti utilizzare un threadpool al quale vanno aggiunti i thread che vuoi eseguire. Se setti la dimensione del pool ad 1, potrebbe fare al caso tuo. Ma non so se puoi fare questo con android.
Invece, nello specifico per android, il meccanismo degli handler/messages potrebbe fare al caso tuo.
Eh non credo esistano threadpool per android, ora mi documento un po...
io avevo pensato di fare un thread, il quale gestisce consecutivamente gli altri 6 thread, cioè nel senso gli URL li chiamo URL1,URL2,URL3,URL4,URL5,URL6
nell'ui faccio un new ThreadManager(handler);
threadmanager nel run avvia il 1° DownloadThread con URL1 passandogli un threadHandler.
una volta che URL1 è finito, restituisce un message al ThreadManager che lo valuterà ed eseguirà url2 e cosi via.
Alla fine basta fare nel message in risposta
WHAT=ID_DOWNLOAD_OK
ARG0 =Num_Thread_Eseguito
OBJECT=Json
Pensavo inoltre di salvarmi i 6 Json e poi di parsarli/salvarli nel db tutti in un colpo (per evitare di aprire/chiudere il db troppe volte).
Voi che dite? sto cercando la migliore implementazione riguardo all'efficienza, non mi interessa se devo fare procedimenti lunghi o complicati, mi basta sia il piu efficiente possibile.
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 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Download di piu file da diversi URL, multithreading?
« Risposta #3 il: 10 Novembre 2010, 09:24:26 CET »
0
Proprio quello che avwvo pensato quando parlavo di handler e messages.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Nicola_D

  • 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:Download di piu file da diversi URL, multithreading?
« Risposta #4 il: 10 Novembre 2010, 09:48:35 CET »
0
ho trovato che c'è il threadpool, ExecutorService e ThreadFactory, sto cercando un tutorial (java SE o android) per capire un po come va, dalla documentazione non capisco come usarlo, perchè io voglio eseguire LO STESSO THREAD (intendo lo stesso tipo di classe) con parametri diversi (url in questo caso), senza istanziarlo piu volte.
Da quel che ho capito ThreadFactory ti permette di dire COME creare i thread, ma non ho capito ancora, ora vedo.
In alternativa mi faccio un Runnable che nel costruttore accetta un INT, questo int è l'indice di un String[] di url, nel runnable poi creo connessione,scarico ecc, e do indietro il json in formato String. Però devo un po capire, perchè i vari json poi devono essere eseguiti in un thread a parte, bella rogna ma mi pare un'operazione interessante, dalla quale può scaturire un'ottimo snippet!
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 Nicola_D

  • 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:Download di piu file da diversi URL, multithreading?
« Risposta #5 il: 10 Novembre 2010, 14:54:41 CET »
0
Trovato e riuscito! le performance sembrano anche ottime.
Detta in breve ho creato un Thread manager che gestisce un newSingleThreadExecutor() che crea un thread pool da un solo thread, a questo con un ciclo while ho passato 6 Callable<String>, ogniuno dei quali in base all'indice passato nel costruttore utilizza un diverso URL e restituisce il json scaricato.
Fatto questo nella mia classe Thread Manager prendo le Stringhe restituite dall'esecuzione dei callable (con Future<T>.get(), vedi documentazione di ExecutorService), dopodichè faccio il parsing di tali stringhe.
Se arrivo stasera posto lo snippet,intanto lascio aperto qui in caso qualcuno chieda o abbia idee migliori
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