2016-08-12 13 views
6

Chciałbym poprosić kogoś o wyjaśnienie mi proszę, jakie są główne różnice między HandlerThread i IntentService i jakie są główne scenariusze użycia?HandlerThread vs IntentService

Rozumiem, że HandlerThread zawiera Looper, który zarządza MessageQueue, który jest podawany przez Handler. O ile rozumiem, możesz przepchnąć zadanie dla HandlerThread i będzie ono wykonywane. Jest to świetna rzecz do wykorzystania w długich operacjach, które nie są powiązane z systemem operacyjnym, w których można przekazać wyniki z powrotem do interfejsu użytkownika przez runOnUiThread().

W przeciwieństwie do tego, IntentService jest dobre dla długotrwałych operacji niezwiązanych z interfejsem użytkownika, może wykonywać zadania po kolei, gdy jest wykonywane z zadaniami, które wywołuje selfStop(), aby samemu się zamknąć. Jeśli IntentService pracuje nad zadaniem, kiedy przychodzi nowe żądanie, dodaje do kolejki i przetwarza drugą, gdy kończy się na 1..

Z mojego punktu widzenia wykonują tę samą pracę w taki sam sposób. Załóżmy, że mam aplikację, gdzie użytkownik TAP na przycisku, zaczynam pobierać plik. Jeśli użytkownik kliknie kilka razy, nowe zadanie będzie czekało w kolejce, uruchamiając drugą tylko po wykonaniu pierwszego. Co powinienem użyć? IntentService lub HandlerThread?

Odpowiedz

5

Tak więc, po kontroli kodu źródłowego zarówno HandlerThread i IntentService znaleźliśmy następujące:

  • IntentServie ma instancję HandlerThread wewnątrz (to jest oddzielone nitki pracy)
  • IntentService wywoływania selfStop () po wykonaniu metody onHandleIntent(), aby się wyłączyć (ponieważ rozszerza klasę usług).
  • IntentService jest rozszerzany z samej klasy Service, więc jeśli chcesz, możesz ją uruchomić w oddzielnym procesie, jeśli chcesz.

IntentService onCreate metoda(), tworząc nić roboczą:

@Override 
public void onCreate() { 
    super.onCreate(); 
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); 
    thread.start(); 
    mServiceLooper = thread.getLooper(); 
    mServiceHandler = new ServiceHandler(mServiceLooper); 
} 

IntentService własnej obsługi, potrzebne do zabicia usługę po zakończeniu pracy:

private final class ServiceHandler extends Handler { 
    public ServiceHandler(Looper looper) { 
     super(looper); 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     onHandleIntent((Intent)msg.obj); 
     stopSelf(msg.arg1); 
    } 
} 

W moim czytaniu IntentService jest połączeniem HandlerThread i Service.

Wszelkie dalsze odpowiedzi i rozwiązania są mile widziane!