2013-02-28 26 views
40

Zastanawiam się, kiedy należy używać handler.post(runnable); i kiedy należy używać new Thread(runnable).start();Kiedy używać handler.post(), gdy do nowego wątku()

To jest wspomniane w dokumentacji dla programistów Handler:

Powoduje, że Runnable r zostanie dodane do kolejki komunikatów. Działający zostanie uruchomiony na wątku, do którego dołączony jest ten przewodnik.

Czy to znaczy, jeśli piszę w onCreate() z Activity klasy:

Handler handler = new Handler(); 
handler.post(runnable); 

następnie runnable zostanie wywołana w osobnym wątku lub w wątku aktywności użytkownika?

Odpowiedz

64

Powinieneś używać Handler.post(), kiedy chcesz wykonywać operacje w wątku interfejsu użytkownika.

Załóżmy, że w wywołaniu zwrotnym (działającym w osobnym wątku), który chcesz zmienić tekst TextView, powinieneś użyć Handler.post().

W systemie Android, podobnie jak w wielu innych frameworkach interfejsu użytkownika, elementy interfejsu użytkownika (widżety) można modyfikować tylko z głównego wątku.


Edit: przykład długotrwałych zadań

mHandler = new Handler(); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // Perform long-running task here 
    // (like audio buffering). 
    // you may want to update some progress 
    // bar every second, so use handler: 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // make operation on UI - on example 
     // on progress bar. 
    } 
    }); 
    } 
}).start(); 

Oczywiście, jeśli zadanie chcesz wykonać jest naprawdę długa i istnieje ryzyko, że użytkownik może przełączyć się na inną aplikację w W międzyczasie powinieneś rozważyć użycie Service.

+0

Ale jeśli mówię, że chcę buforować strumień audio z Internetu. Czy powinienem to zrobić poprzez handler.post lub przez nowy wątek? – reiley

+1

Naprawdę zależy od Twoich wymagań. Zastanowiłbym się nad nowym wątkiem lub usługą. Zaktualizuję odpowiedź za pomocą przykładu za sekundę. – kamituel

11

przykładem jest okradł:

mHandler = new Handler(); 
new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Alternatywnie można pominąć obsługi i korzystania z metody POST na widoku bezpośrednio:

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mUiView.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Jest to dobry post, który przedstawia różnicę: What exactly does the post method do?

18

Aby odpowiedzieć na konkretne pytanie:

Czy to oznacza, że ​​w klasie onCreate of Activity napiszę:

Handler treser = new Handler() hanlder.post (runnable); następnie uruchomione będą wywoływane w osobnym wątku lub wątku Aktywności?

Nie, nie będzie. Runnable zostanie wywołany na samym Głównym wątku. Handler jest po prostu używany do wysyłania wiadomości do wątku, do którego jest dołączony (gdzie jest tworzony). Nie tworzy wątku samodzielnie. W twoim przykładzie utworzyłeś Handler w głównym wątku (w którym wywoływana jest Activity.OnCreate()) i dlatego każda wiadomość umieszczona na takim Handlerze będzie działała tylko na głównym wątku.

+3

Prawidłowe odpowiedzi nie zawsze są wybrane jako najlepsze. Dzięki –

+0

Właśnie zmieniłeś całkowicie perfs mojej aplikacji !! Przejście z programu obsługi do wątku właśnie spowodowało, że moja aplikacja lata! Tak wielkie dzięki! – Mitchapp

2

użycie handler.post() kiedy chcesz postu: kod (zwykle od wątku tła) do głównym wątku. Tak, POST, tak jak ty, wyślij list do kogoś. Z pomocą handlerka kod zostanie wykonany JAK NAJSZYBCIEJ, czyli prawie natychmiast.