Autore Topic: Priorità AsynkTask  (Letto 851 volte)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Priorità AsynkTask
« il: 07 Settembre 2015, 18:37:27 CEST »
0
Ho notato con immenso piacere una problematica di difficile rioluzione all' interno della mia applicazione.

Come molti fanno, carico degli elementi in una ListView/RecycleView, mediante Asynk. O meglio, Uso Picasso, e a sua volta fa uso di codice non bloccante. Il problema è che ho altre liste da popolare nell' applicazione. Quindi se in una listView faccio lo scrool fino in fondo e ci sono 100 elementi, partiranno 100 thread. Se scrollo 10 volte, il numeri si moltiplica. Ora, apro un fragment/activity dove risiede un' altra listView. Qui uso un Asynk per avere la mia List<Item>. Arrivato al onPostExecute, la listView viene popolata. Però questo Asynk si accoda a tutti quelli che ancora stanno eseguendo il loro lavoro.

Risultato: 1-2 secondi di attesa. Come posso risolvere?

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Priorità AsynkTask
« Risposta #1 il: 08 Settembre 2015, 02:04:41 CEST »
0
perche accoda ? dovrebbe essere comunque un thread a parte quindi perche accodarsi ? credo vada comunque in parallelo a quelli precedentemente lanciati se non hai settato la cancellazione della asyntask in caso di cambio activity/fragment ... magari il rallentamento potrebbe dipendere più da un listview particolarmente grande " tante righe " , io ho avuto un problema simile quando mostro ad esempio la rubrica dei contatti ed essi iniziano ad essere oltre i 200 ... quindi listview molto grande... è questo il caso ?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Priorità AsynkTask
« Risposta #2 il: 08 Settembre 2015, 09:46:18 CEST »
0
200 asynk non eseguono in parallelo.
Di solito liste da 300 righe le gestisco bene

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:Priorità AsynkTask
« Risposta #3 il: 08 Settembre 2015, 09:49:20 CEST »
0
200 asynk non eseguono in parallelo.
Di solito liste da 300 righe le gestisco bene

Posso non ricordarmi i numeri esatti, ma credo che il thread pool per gli asynctask sia molto più piccolo, sui 20. E comunque di default non sono eseguiti in parallelo, ma uno dopo l'altro (a meno che non venga impostato diversamente).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Priorità AsynkTask
« Risposta #4 il: 08 Settembre 2015, 09:52:51 CEST »
0
capito ... e rendere le asyn cancellabile se l'activity  / fragment non è più attiva ? in modo da scartare tutte le asyn non più facente parte di ciò che stai visualizzando ?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Priorità AsynkTask
« Risposta #5 il: 08 Settembre 2015, 11:18:32 CEST »
0
Per bradipao...io sapevo che fino 6 (o comunque un certo numero ) sono paralleli e poi sì accodano.

Per Pietroconti....ci ho pensato...ma dovrei intervenire sul mio custom view holder del mio adapter per la mia recycleview e sinceramente non so dove mettere le mani.

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Priorità AsynkTask
« Risposta #6 il: 08 Settembre 2015, 11:45:50 CEST »
0
forse dico una minchiata ma mi pare che per rendere la task cancellabile ,fai una cosa del genere
dichiari globalmente la tua task
Codice (Java): [Seleziona]
ListAsynTask asynTask;
dove esegui le tue istruzioni invece di inizializzare la task cosi
Codice (Java): [Seleziona]
new ListAsynTask().execute();
sostituisci in

Codice (Java): [Seleziona]
asynTask = new ListAsynTask();
asynTask.execute();

ora fai l'override dello stato
Codice (Java): [Seleziona]
@Override
    protected void onDestroy()
    {
       super.onDestroy();
       if (asynTask!=null) {
                  asynTask.cancel(true);
       }
    }

e al fine / cambio di activity la task viene cancellata..... credo  o_O

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Priorità AsynkTask
« Risposta #7 il: 08 Settembre 2015, 11:54:28 CEST »
0
Ho spiegato orina. I miei asynk sono in una classe view holder necessaria per un adapter e per una recyckeview.

Inoltre on Destroy() non mi serve. Significa che l' app sarà terminata

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Priorità AsynkTask
« Risposta #8 il: 08 Settembre 2015, 11:56:56 CEST »
0
puoi sostituire in onDetach() che viene chiamato col passaggio in un altra activity / fragment .... ma forse nel tuo caso non è una soluzione applicabile , sorry

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:Priorità AsynkTask
« Risposta #9 il: 08 Settembre 2015, 12:03:59 CEST »
0
Per bradipao...io sapevo che fino 6 (o comunque un certo numero ) sono paralleli e poi sì accodano.

Qua: AsyncTask | Android Developers

Nella parte Order of execution dice:

Citazione
When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Priorità AsynkTask
« Risposta #10 il: 08 Settembre 2015, 12:30:54 CEST »
0
Si, avevo letto una discussione di stackoverflow, probabilmente datata :)

Ma io non mi sto lamentando del fatto che essendo in una coda siano lenti nella loro esecuzione. Speravo ci fosse un costrutto a monte del tipo .esegui(int priority)...ma vabbe :)

Post unito: 08 Settembre 2015, 19:16:02 CEST
ho provato a mettere .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Noto con piacere che forse le prestazioni migliorano, però se scorro velocemente, faccio in modo da avere 2xx thread (o magari molti meno e i restanti in coda)  in parallelo, e quando scrollo 400 item, l'app si blocca e non risponde :)
« Ultima modifica: 08 Settembre 2015, 19:16:02 CEST da tonno16, Reason: Merged DoublePost »