2014-04-03 12 views
5

Używam postDelayed sposobu Handler w celu wykonywania czynności po pewnym czasie:Jak zmienić/zresetować stanowisko obsługi opóźnionego czasu?

private static int time_to_wait = 2000; 

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
    // Make Action 
    } 
}, time_to_wait); 

Teraz w połowie czasu oczekiwania chcę zmienić wartość pozostałych milisekund tytułu niektóre wyniki przetwarzania, załóżmy, że teraz czekał 1000 ms i chcę, aby zaczął ponownie liczyć od ponownie, więc ustawiam wartość time_to_wait na 2000, ale nie bierze to pod uwagę, ponieważ zajmuje tylko wartość zmiennej (2000) i po prostu czeka, aż do tego czasu, niezależnie od zmiany time_to_wait wartość do dowolnej innej wartości.

+1

Musisz anulować i ponownie wyświetlić wersję, którą mogę uruchomić. [StackOverflow] [1] [1]: http://stackoverflow.com/questions/7407242/how-to-cancel-handler-postdelayed – Kaediil

+0

@Kaediil nie będzie tak Efektywny w moim przypadku –

+0

'int' jest typem pierwotnym i jest przekazywany przez wartość - wartość jest kopiowana i nie jest w żaden sposób połączona z pierwotną zmienną pierwotną. Jeśli przekazujesz zmienną 'int' do jakiejś metody, a następnie spróbuj zmienić tę zmienną gdzieś indziej (poza tą metodą), zmiany tej zmiennej nie będą odzwierciedlane w tej metodzie, ponieważ posiada ona własną kopię zmiennej – Drew

Odpowiedz

7

ten można osiągnąć poprzez łatwo utworzyć Runnable, który będzie wyświetlany przez przewodnika, a następnie tworząc procedury obsługi elementu jako statyczną, wreszcie, gdy chcesz, aby zatrzymać go po prostu usunąć zwrotnego twoich stworzony runnable, a jeśli chcesz uruchom ponownie, musisz usunąć wywołanie zwrotne i przypisać je ponownie:

Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     // your code here 
    } 
}; 

public static Handler myHandler = new Handler(); 
private static final int TIME_TO_WAIT = 2000; 

public void start() { 
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT); 
} 

public void stop() { 
    myHandler.removeCallbacks(myRunnable); 
} 

public void restart() { 
    myHandler.removeCallbacks(myRunnable); 
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT); 
} 
0

można po prostu spróbować

handler.removeMessage(what) 
handler.sendMessageDelayed(time_to_wait + INTERVER); 

każdym razem trzeba najpierw usunąć wiadomość, a następnie wysłać nową wiadomość.

Powiązane problemy