Nelle versioni recenti di Android, "esegui" farà sì che il tuo compito venga inserito in una coda da cui un singolo thread in background lo preleva e lo esegue; come dici tu, tali compiti sono eseguiti in serie (anche se non dovresti fare affidamento su questo, poiché le versioni precedenti di Android iniziarono un thread per ogni attività).
executeOnExecutor, tuttavia, offre un maggiore controllo, poiché è possibile utilizzare qualsiasi oggetto che implementa l'interfaccia di Executor per eseguire l'attività. Anche se ti limiti solo all'implementazione standard di ThreadPoolExecutor, ciò significa che puoi assumere il controllo di:
- il numero massimo di attività che possono essere eseguite simultaneamente
- il tipo e i parametri della coda utilizzata (ad esempio se la coda è limitata o non limitata)
- il comportamento quando una nuova attività viene inviata mentre la coda è piena
Per la maggior parte degli scopi, execute è adeguato, ma dovresti usare executeOnExecutor quando hai bisogno di più controllo, sia perché un singolo thread non è sufficiente, o perché devi garantire di ottenere solo un thread quando usi versioni precedenti di Android, o perché hai un requisito inusuale su come vengono gestite le attività inviate.