2012-12-30 9 views
8

Mam asynktask, który robi coś, kiedy jest gotowy, chcę go nadawać, że to zrobione.wysyłanie audycji z asynctasks

zwykle zrobiłbym: context.sendBroadcast(new Intent(MYINTENT)); jednak asynctask nie ma kontekstu. Widziałem kilka odpowiedzi na te pytania sugerujące wysłanie odwołania do kontekstu działania aplikacji do asynktaksu. ale to odniesienie jest złe, gdy użytkownik obraca ekran. i ręczne utrzymywanie referencji jest złym rozwiązaniem (wymaga zbyt wiele od działania tworzącego asynktask, którego nie kontroluję). teraz pytania są następujące:

1) Dlaczego Android jest skonfigurowany w ten sposób? dlaczego potrzebuję nawet kontekstu, aby wysłać transmisję, gdy transmisje mogą być rejestrowane i obsługiwane przez inne konteksty?

2) Czy istnieje dobre rozwiązanie tego problemu? (good = wymaga tak mało jak to tylko możliwe od działania tworzącego asynktask, zachowuje rotacje itp.).

+1

Prześlij kontekst aplikacji do 'AsyncTasnk' za pomocą' Activity.getApplicationContext() '. Kontekst ekranu nie wpływa na kontekst aplikacji, co oznacza, że ​​odniesienie do niego będzie nadal aktualne po potencjalnym obrocie. – Paul

+0

@Paul dobrze, że rozwiązuje problem techniczny, dziękuję. wciąż zastanawiam się, dlaczego potrzebuję nawet kontekstu, aby wysyłać audycje (z punktu widzenia projektu). – Oren

Odpowiedz

16

Kontekst, z którego korzystasz obecnie w AsyncTask, to kontekst aktualnej aktywności. Domyślnie obrót ekranu zniszczy bieżące wystąpienie tego działania i utworzy nowe. To jest (nawet jeśli nie wydaje się tak na początku) zamierzone zachowanie. Dzieje się tak dlatego, że możesz chcieć mieć różne zasoby (układy, rysunki itp.) Dla różnych orientacji ekranu. Aby zastosować te potencjalnie różne zasoby, Android odtworzy działanie w każdym obrocie.

Można temu przeciwdziałać, ustawiając atrybut android:configChanges w pliku AndroidManifest.xml, ale w twoim przypadku to rozwiązanie nie jest zalecane.

Właściwym sposobem rozwiązania tego problemu jest przekazanie kontekstu aplikacji do AsyncTask zamiast do działania (Activity dziedziczy po Context). Możesz to zrobić, dzwoniąc pod numer getApplicationContext() z instancji swojej aktywności. Kontekst aplikacji będzie utrzymywał zdarzenia, takie jak rotacja ekranu i będzie obowiązywać do momentu, w którym system zabije aplikację.

Jako dlaczego trzeba instancji kontekstu zrobić podstawowe zadania:

Interfejs do globalnej informacji o środowisku aplikacyjnym. Ta jest klasą abstrakcyjną, której implementację zapewnia system Android . Umożliwia on dostęp do zasobów specyficznych dla aplikacji i klas, jak również aktualne zaproszenia do operacji na poziomie aplikacji, takich jak działalności Rozpoczynając, nadawanie i odbieranie zamiarów itp

ten sposób oficjalna dokumentacja definiuje Context. Może ktoś może to wyjaśnić lepiej, ale dla mnie ta definicja jest wystarczająca.

Powiązane problemy