HandlerThread vs Executor – Quando è uno più appropriato rispetto all'altro?

Sono solo curioso se ci sono momentjs in cui dovrei scegliere un Executor su un HandlerThread . Ci sono momentjs che uno è superiore rispetto all'altro, o dovrei proprio attaccare con il HandlerThread ? Nel mio caso, sto attualmente ascoltando un ServerSocket per le connessioni e gestendo each richiesta su un thread separato creato da un Executor . Anche se ho dato un esempio specifico, sto solo cercando casi in cui uno è più appropriato dell'altro. Tuttavia, accolgo i commenti sul mio disegno.

  • "Errore di analisi: esiste un problema di analisi del pacchetto" durante l'installazione di un'applicazione Android
  • Come si connette a una determinata networking Wi-Fi in Android a livello di programmazione?
  • Nessun repository trovato errore nell'installazione di ADT in Eclipse Indigo
  • Il mio server può ricevere il riconoscimento dal GCM una volta che il messaggio previsto viene consegnato all'applicazione android?
  • Problema con bluetooth su android 2.1 (samsung spica i5700) where l'accoppiamento funziona ma la connessione non funziona
  • EmptyThrowable: il file APK * .apk non esiste sul disco
  • Flip freccia su spinner android nella barra degli strumenti
  • Come azzerare l'altoparlante audio in android
  • Modificare le impostazioni di lingua (locale) per il dispositivo
  • Adattatore personalizzato per il cassetto di navigazione
  • Fotocamera Android - A volte quando prendo foto, l'applicazione si blocca e la camera non è utilizzabile
  • Creazione di un Spinner da un ArrayList <Object>
  • 2 Solutions collect form web for “HandlerThread vs Executor – Quando è uno più appropriato rispetto all'altro?”

    La class Executor è più potente e può utilizzare un pool di thread, mentre each gestore fa riferimento a un singolo thread. L'esecutore consente di get tutte le attività pianificate e annullarle se vuoi. Il gestore d'altra parte non risponderà a semplici domande come, quante attività sono in attesa o mi danno un riferimento a tutti i compiti di attesa. Credo che una delle ragioni per cui il gestore sia più limitato è che Android ti dà accesso al gestore principale che utilizza per l'interface utente e si potrebbe veramente rovinare il sistema operativo se hai iniziato a annullare le attività del sistema operativo.

    In generale, se avete bisogno di un pool di thread o di un sacco di potenza utilizzare l'esecutore. Se hai solo bisogno di un bel thread di background per eseguire una attività alla volta utilizzare un gestore. Come esempio quando voglio interrogare il mio database, voglio solo che una query venga visualizzata alla volta e non voglio generare un ANR in modo da utilizzare un gestore in esecuzione su un thread di background per eseguire le mie query.

    Credo che la scelta del tuo esecutore sia appropriata perché si desidera gestire contemporaneamente più richieste in entrata e un Gestore può fare solo una alla volta.

    UPDATE: Come creare un gestore che viene eseguito su un thread di background:

    Nel tuo constructor o onCreate scrivi quanto segue, ovviamente puoi impostare la priorità a tutto ciò che ti piace:

     public class MyClass { private Handler mBgHandler; public MyClass() { HandlerThread bgThread = new HandlerThread("My-Background-Handler"); bgThread.start(); mBgHandler = new Handler(bgThread.getLooper()); } } 

    AGGIORNAMENTO: non dimenticare di uscire () o di smettere () il tuo HandlerThread quando sei finito con esso altrimenti rimarrà in attesa per sempre

    Non seguirei il codice di esempio nella risposta di satur9nine dal 2011-22 dicembre.

    Thread.MIN_PRIOROTY è mappato su android.os.Process.THREAD_PRIORITY_LOWEST. Citazione :

    La più bassa priorità di thread disponibile. Solo per coloro che, veramente, non vogliono correre se succede qualcosa di diverso.

    Vorrei alless usare android.os.Process.THREAD_PRIORITY_BACKGROUND, così:

     HandlerThread bgThread = new HandlerThread("handler name"); Process.setThreadPriority(bgThread.getThreadId(), Process.THREAD_PRIORITY_BACKGROUND); bgThread.start(); mBgHandler = new Handler(bgThread.getLooper()); 

    Questo assegna la priorità predefinita di background Android al thread.

    Attualmente, thread di priorità Process.THREAD_PRIORITY_BACKGROUND e inferiore condividono una quantità artificialmente limitata di tempo di CPU tramite un cgroup Linux, vedere ad esempio qui . Se un'attività di background non solo aspetta l'I / O, ma esegue calcoli reali, considero di aumentare la sua priorità da android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE che (attualmente) lo sposta dal cgroup di background pur non compromettendo in maniera sostanziale l'interface utente e attività in tempo reale.

    Aggiornamento: la risposta di satur9nine è stata modificata silenziosamente il 2013-gennaio-08 per non impostare la priorità più bassa ansible. Il HandlerThread avrà implicitamente una priorità di android.os.Process.THREAD_PRIORITY_BACKGROUND. Ciò significa che ora ottiene la priorità predefinita di attività di background, ma è ancora limitata a consumare un massimo artificiale del tempo di CPU del 10% insieme a tutti gli altri task di background che possono esistere. Se questo non è desiderato, usa il mio codice sopra ad esempio con

     Process.setThreadPriority(bgThread.getThreadId(), Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE); 

    per sollevare il thread di background fuori dal gruppo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.