2012-07-17 9 views
38

Przewodnik programisty dla Androida zawiera porządną sekcję dotyczącą korzystania z Fragments. Jednym ze sposobów wykorzystania Fragmentów jest brak interfejsu użytkownika. Jest kilka odniesień do używania tego jako sposobu przetwarzania w tle, ale jakie są zalety Fragments w tym obszarze? Gdzie mogę wybrać Fragment na wątki, AsyncTasks, Handlers, itp. Do przetwarzania w tle?Jaki jest przypadek użycia fragmentu bez interfejsu użytkownika?

Odpowiedz

36

Instancja Fragment może przetrwać poprzez zmiany konfiguracji urządzenia (np. Obrót ekranu). Ponieważ Activity zostanie zniszczony i odtworzony po zmianie konfiguracji, trudno zaprojektować taki, który będzie śledzić wątek lub AsyncTask. Z drugiej strony, system zajmuje się ponownym podłączeniem utrwalonego Fragment do właściwego Activity na drugim końcu (że tak powiem) zmiany konfiguracji. Wciąż używasz wątku lub AsyncTask, ale teraz Fragment trzyma go zamiast tego.

Mogą to być inne zastosowania, ale jest jedna, którą mogę wymyślić.

+21

Prawdopodobnie powinno być uruchomione zadanie asynchroniczne w aplikacji '' 'app.Service''''', aby upewnić się, że zadanie synchronizacji nie zostanie ponownie przesłane podczas odtwarzania. Używamy fragmentu bez interfejsu użytkownika, aby działać jako "kontroler" zbierający wiadomości (transmisje) z innych fragmentów i modyfikujący kontrolki podrzędne. Zapewnia ładny poziom separacji bez zanieczyszczania macierzystego kodu aktywności zapewniającego przenośność i modularyzację ... jeden z wielkich zwycięstw przy użyciu '' '' Fragmentu'''. – OceanLife

+0

Dzięki Karakuri i OceanLife, to dobra wiadomość. –

+0

Asynktaski nie powinny być nigdy powiązane z aktywnością, od której są uruchamiane. Co się stanie, jeśli użytkownik przejdzie lub wróci podczas zadania asynchronicznego? –

10

Mam duży fragment dość skomplikowanego kodu, który obsługuje logowanie do różnych serwisów społecznościowych - Facebook, Google, Twitter. Jest to kod, który muszę ponownie wykorzystać w różnych działaniach, ponieważ użytkownik może logować się z różnych miejsc w aplikacji. Nie należy do podstawowej klasy aktywności, ponieważ można dziedziczyć tylko z jednej klasy i używam tego dziedziczenia dla innych, niepowiązanych funkcji.

Fragment nie zawierający ui jest idealny do mojej sytuacji, a fragment pasuje do potrzeby ładnie, ponieważ potrzebuję wywołania zwrotnego cyklu życia, na przykład (Facebook jest znany w tym względzie, potrzebujący, na przykład, naActivityResult, itp.).

+0

Czy uzyskujesz dostęp do tej samej instancji fragmentu bez interfejsu z różnych działań lub czy każde działanie tworzy własną kopię fragmentu? Sądziłem, że ten fragment bez UI będzie dobrym sposobem na przeniesienie dużej części pobranych danych z aktywności nadrzędnej na dziecko, ale najwyraźniej każde działanie ma swój własny menedżer fragmentów i nie jest to możliwe. –

+0

@Iwo Banas, każde działanie ma swój własny menedżer fragmentów. Jednak różni menedżerowie fragmentów po prostu dodają i wykonują ten sam fragment, kiedy muszą to zrobić. –

3

Zgadzam się z Greg Ennis.

Pracuję teraz nad aplikacją, która musi wykonać serię wywołań funkcji API REST. W większości przypadków są one wykonywane w ramach jednego działania. Ale użyłem tylko bezgłowego fragmentu, aby poradzić sobie z przypadkiem, w którym dwie różne czynności wymagały wykonania tej samej sekwencji wielu połączeń i oczywiście obsługiwały błędy w dowolnym miejscu sekwencji. Centralizując sekwencję w fragmencie, mogłem uniknąć duplikowania sporych ilości kodu.

Mamy kolejne wywołanie api, które zwraca wiele danych, które są teraz analizowane w wątku interfejsu użytkownika i trwają zbyt długo. W przyszłej wersji interfejsu API strony serwera będzie strona danych, a nasza aplikacja będzie wymagane, aby wykonać serię wywołań api, aby uzyskać pełne wyniki. Myślę, że byłaby to świetna aplikacja dla zatrzymanego bezgłowego fragmentu. Czynność inicjująca może rozpocząć bezgłowy fragment i sekwencję wywołania. Jeśli z pierwszego połączenia nie wystąpi żaden błąd, ta czynność może rozpocząć następną czynność, wyświetlając początkowe wyniki, podczas gdy fragment po prostu kontynuuje dłubanie i pytając serwer o następną stronę danych. Wywołania api są już wykonywane w wątku tła. Jestem prawie pewien, że zatrzymany fragment będzie musiał działać na wątku roboczym.

Nie ma więcej informacji na temat zatrzymanych fragmentów na Understanding Fragment's setRetainInstance(boolean)

2

te nazywane są również Headless Fragments. Możesz przeczytać więcej here

+0

to wygląda jak odpowiedź tylko na link ... –

+0

Tak .. Bo myślę, że już odpowiedział ... I nie mogę dodać komentarza .. –

Powiązane problemy