2012-11-01 14 views

Odpowiedz

33

Wynik Odbiornik:

Generic interface for receiving a callback result from someone. 

Broadcast Receiver:

Base class for code that will receive intents sent by sendBroadcast(). 

EDIT:

Tło: Wszystkie operacje sieciowe/długo wykonywanych operacji powinny odbywać się z dala od głównego wątku. Dwa sposoby, aby to zrobić:

  1. asynchroniczny zadanie - do prostych sieci jak powiedzieć retreive obraz/zrobić db przetwarzania
  2. Service - Dla Complex długo uruchomionego tle procesu

Jeśli trzeba wykonać Pracuj poza głównym wątkiem, ale tylko podczas interakcji użytkownika z aplikacją, powinieneś raczej stworzyć nowy wątek, a nie usługę. Na przykład, jeśli chcesz odtwarzać muzykę, ale tylko podczas aktywności, możesz utworzyć wątek Asynchroniczny. Ale jeśli chcesz, aby kontynuować proces nawet gdy użytkownik zamyka aplikację (powiedzmy do pobrania), a następnie skorzystać z usługi

Powiedzmy wybrać 2. Teraz

  1. aktywność Ty wysyła żądanie do usługi internetowej
  2. Twoja usługa wykonuje tę operację, używając polecenia DefaultHttpClient
  3. Wysyła dane do Twojej aktywności.

    Trzeci etap odbierania danych tutaj można przeprowadzić na dwa sposoby

1.) odbiornika Broadcast: Wiele odbiorników mogą odbierać dane. Używane, jeśli chcesz wysyłać dane/powiadomienia pomiędzy aplikacjami (powiedzmy, że również wchodzisz w interakcję z fb i twitterem, wieloma odbiornikami do twojej audycji internetowej), , gdy wysyłasz nadawanego systemu jego szeroki zasięg.

2.) Odbiornik wyników: Twoja aplikacja jest jedynym odbiorcą danych. Jest to interfejs, który implementujesz i przekazujesz go do intentService poprzez putExtra. IntentService następnie pobierze ten obiekt i wywoła jego funkcję receiver.send, aby wysłać wszystko (w pakiecie) do aktywności wywołującej .Odbiornik wynik ma pierwszeństwo nad odbiorników, jeśli cała komunikacja jest wewnętrzny do aplikacji

EDIT: Należy również wspomnieć tę ostrożność

Uwaga: Usługa działa w głównym wątku jego proces hostowania - usługa nie tworzy własnego wątku i nie działa w oddzielnym procesie (chyba że użytkownik określi inaczej). Oznacza to, że jeśli twoja usługa będzie wykonywać intensywne prace lub operacje blokujące procesor (takie jak odtwarzanie MP3 lub praca w sieci), powinieneś utworzyć nowy wątek w ramach usługi, aby wykonać tę pracę. Używając oddzielnego wątku, użytkownik zmniejszy ryzyko błędów ANR (Application Not Responding) i główny wątek aplikacji może pozostać dedykowany do interakcji użytkownika ze swoimi działaniami.

+0

Który z nich najlepiej nadaje się do długotrwałego procesu sieciowego? Np .: Pobieranie pliku, JSON parsing.etc – user1670564

+0

Sprawdź najlepszą odpowiedź tutaj: http://stackoverflow.com/questions/3197335/restful-api-service, aby zrozumieć wynik odbiornika + wzór usługi. Daje naprawdę dobry przypadek użycia aplikacji – Slartibartfast

+0

Dzięki za odpowiedź. Przejrzałem link. Po przekroczeniu łącza mam wątpliwości w obu odbiornikach. Oba odbiorniki obsługują długo działające zadania. W jakiej sytuacji muszę korzystać z transmisji i wyników. – user1670564

3

Te dwie klasy to całkowicie inna niż. Jest to właściwie ta sama różnica, co między Broadcast i Wynik.

  • co to jest transmisja? W prostych słowach jest to komunikat, który jest widoczny dla całego systemu i może być pochłonięty przez każdą część systemu (który zna kontrakt), nie pochodzi od smb reuest;
  • co oznacza wynik? Jest to coś, czego oczekujemy od innej części systemu. Zwykle jest tylko jeden odbiornik dla wyniku i zwykle ten odbiorca zażądał przetworzenia w celu uzyskania wyniku (poczuj różnicę - w przypadku transmisji nikt nie musi wykonywać żadnych "żądań", aby mógł on powstać);

To było wyjaśnienie z logicznego punktu widzenia. Z perspektywy kodu, jeśli porównasz BroadcastReceiver i ResultReceiver, możesz zauważyć ogromną różnicę. Zasadniczo obie klasy są budowane na podstawie IPC, ale BroadcastReceiver jest znacznie bardziej złożony ze względu na jego inną naturę (którą starałem się wyjaśnić w pierwszej części).

+0

Wheteher zarówno odbiornik może obsługiwać żądanie i odpowiedź Async HTTP ? – user1670564

+0

hm, myślę, że nie, ponieważ oba nie dotyczą żądania HTTP. Jeśli potrzebujesz, możesz wysłać wynik z usługi lub asynchronicznego zadania za pomocą dowolnego z nich. Ale dla AsyncTask Możesz zwykle używać Handler'a. – sandrstar

8

A BroadcastReceiver to odbiornik odbierający transmisje. Są one wysyłane przez kogoś w intencji, że może być wielu odbiorców, którzy je otrzymują (np. Audycje radiowe).

Funkcja ResultReceiver służy z drugiej strony do otrzymania wyniku oddzwonienia od innej osoby. Można to porównać do walkie-talkie, w którym dzwonisz do kogoś, a następnie otrzymasz odpowiedź (wynik) od tego, do którego zadzwoniłeś.

+0

Dzięki za odpowiedź! Ładny przykład do zrozumienia ... – user1670564

0

Broadcast Receiver

Odbiornik transmisji jest elementem, który odpowiada ogłoszeń transmisji całego systemu. na przykład transmisja informująca o wyłączeniu ekranu, niskim poziomie naładowania baterii lub zarejestrowaniu obrazu. Aplikacje mogą także inicjować transmisje - na przykład, aby inne aplikacje wiedziały, że niektóre dane zostały pobrane na urządzenie i są dostępne do użytku. Chociaż odbiorniki rozgłoszeniowe nie wyświetlają interfejsu użytkownika, mogą utworzyć powiadomienie w pasku stanu, aby powiadomić użytkownika o wystąpieniu zdarzenia rozgłoszeniowego. Co więcej, odbiornik telewizyjny jest jedynie "bramą" do innych komponentów i ma za zadanie wykonać bardzo minimalną ilość pracy. Na przykład może zainicjować usługę, aby wykonać pewne prace na podstawie zdarzenia.

Wynik Odbiornik

Jeśli usługa będzie częścią ciebie aplikacji potem robisz to sposób bardziej złożony niż to musi być. Ponieważ masz prosty przypadek użycia niektórych danych z Restful Web Service, powinieneś zajrzeć do ResultReceiver i IntentService.

Ta usługa + wynikRekcja wzorca działa poprzez uruchomienie lub powiązanie z usługą za pomocą metody startService(), gdy użytkownik chce wykonać pewne działanie. Możesz określić operację, która ma zostać wykonana i przekazać wynikowi (działanie) przez dodatki w zamierzeniu.

+0

Zamiast AsyncTask, czy będę korzystać z tej usługi Async webservice? – user1670564

+0

Prawdopodobnie powinieneś dodać słowa, które skopiowałeś + wkleiłeś z Robby Pond tutaj: http://stackoverflow.com/a/3197456/1738090 – w3bshark

Powiązane problemy