2012-02-09 8 views
5

Utworzono instancję Handler w głównym wątku interfejsu użytkownika (mUIHandler) oraz wątek roboczy (inny wątek), gdy próbuję wykonać metodę uruchamiania runnable metoda run zostaje wykonana prawie 9 razy z 10 razy, ale jest 1 raz, kiedy nie zostanie wykonana.handler.post (działający) nie zawsze wykonuje metodę uruchamiania w Androidzie

mUIHandler.post (uiRunnable) -> czy nie zawsze gwarantuje wykonanie metody run obecnej w runnable?

Dodałem nawet metody logowania do sprawdzenia i mogłem zobaczyć, że dzienniki do momentu wykonania inwokacji metody postu zostaną wykonane, ale dzienniki metod uruchamiania nie zostaną wyświetlone.

W jaki sposób post (działający) działa wewnętrznie? czy gwarantuje to, że wątek UI (wątek z handler'em) wykluczy to natychmiast po wywołaniu postu?

Każda pomoc zostanie doceniona.

Dzięki!

+4

Kod pocztowy związany z emisją. – kosa

+1

@thinksteep spróbuje zajrzeć do sugestii podanej przez mattc poniżej, aby sprawdzić, czy mogę coś z tym zrobić. Unikałem umieszczania fragmentu kodu tutaj jako jego ponad 500 linii kodu. Dzięki! – Deva

Odpowiedz

6

Nigdy nie widziałem, aby program obsługi nie działał prawidłowo poprawnie. Kilka rzeczy do zbadania:

  1. Czy istnieje jakaś logika, która może skutkować stanem wyścigu między danymi, z którymi wątek mógłby potencjalnie wchodzić w interakcje podczas wykonywania wątku interfejsu UI?
  2. Czy masz spróbować/złapać w dowolnym miejscu, które może być po cichu jedzenia wyjątek?

Mój głos (bez obejrzenia twojego kodu) jest taki, że prawdopodobnie jest # 1. Nie byłbyś pierwszą osobą, która padłaby ofiarą trudnych do wyśledzenia warunków wyścigu w wyniku współistniejącej logiki.

+0

Dzięki Mattc za odpowiedź sprawdzę, czy jest możliwe warunki wyścigu. (Mam nadzieję, że uda mi się to zlokalizować.) Zostanie zaktualizowany. – Deva

+1

Dzięki @Mattc to był stan wyścigu, który to robił. Na szczęście udało się znaleźć przyczynę. Rzeczywiście dobra nauka. – Deva

+0

Cieszę się, że to znalazłeś. Logika z gwintem jest niezwykle skomplikowana i trudna do debugowania. – MattC

10

W tym samym problemie także mam Androida 2.2, w moim przypadku zarówno Runnables, jak i Messages były używane z tym samym Handlerem.

Po sprawdzeniu kodu źródłowego programu Handler okazuje się, że usunięcie komunikatów o wartości "co" równej 0 powoduje również usunięcie wszystkich oczekujących w kolejce Runnables. Dzieje się tak, ponieważ w klasie Handler Runnable jest wewnętrznie zaksięgowana jako wiadomość o wartości "what" wynoszącej zero, która jest usuwana dowolnym wywołaniem do removeMessages(0). Dlatego unikaj używania zera jako identyfikatora komunikatu.

+0

Jeśli tylko mogą istnieć dwie preferowane odpowiedzi. Nie mam pojęcia, ile czasu ocaliłaś mnie tą odpowiedzią, ale to dużo czasu! –

Powiązane problemy