2016-03-01 12 views
8

Mam sytuację, w której mam ochotę odkrywać nowe koło lub chodzić po domach, aby poradzić sobie z czymś, co już jest "projektem" - więc zanim to zrobię, miałem nadzieję Mogę uzyskać drugą opinię, proszę.Zarządzanie wywoływanymi zwrotami usług serwisowych

Mam usługę zdalną. Jest to stała usługa na pierwszym planie ze względu na niezwykły charakter/funkcjonalność samej aplikacji.

Piszę bibliotekę, aby aplikacje innych firm mogły wiązać się z usługą i korzystać z interfejsów API, które eksponuję Ponieważ obsługuję sam wątek, a większość wywołań zwrotnych ma charakter asynchroniczny, używam podejścia AIDL, z niestandardowymi klasami, które są "Parceled up", aby dostarczyć niezbędne parametry do Usługi. Wszystko do tej pory działa idealnie.

Konstrukcja mojego kodu serwisowego jest bardzo podobna do RemoteService API example, więc powiem, że umieszczenie mojego konkretnego kodu nie zmienia pytania.

Jako interfejs with the example, interfejs każdego żądania zapisuję w pliku RemoteCallbackList, który wydaje się być poręcznym rozwiązaniem dla innych podstawowych elementów.

Jednak moje usługi nie zapewnia tę samą informację do grupy „odbiorców oczekujących”, jak korzystanie z następującym fragmencie pokazuje:

int i = callbacks.beginBroadcast(); 
while (i > 0) { 
    i--; 
    try { 
     callbacks.getBroadcastItem(i).somethingHappened(); 
    } catch (RemoteException e) { 
     // The RemoteCallbackList will take care of removing 
     // the dead object for us. 
    } 
} 
callbacks.finishBroadcast(); 

Zamiast tego wnioski są z wielu różnych typów i dlatego trzeba śledzić, z którego dokładnie interfejsu obiektu, do którego mam wysłać wyniki, z powrotem do. Każde indywidualne żądanie może obejmować dalsze asynchroniczne żądania internetowe i/lub przetwarzanie i konieczność przekazania obiektu wywołania zwrotnego każdemu z nich (za pośrednictwem konstruktora lub tylko parametru metody), gdzie czuję, że zamierzam zrobić coś bardzo żmudnego i z rozwagą, aby rozwiązać problem, który być może mogę uprościć w inny sposób?

Zadanie byłoby łatwiejsze, gdybym mógł zagwarantować, że pierwszy wniosek w, byłby pierwszym wynikiem i dlatego po prostu użyć zamówienia w RemoteCallbackList przed usunięciem odniesienia do nich, ale tak nie jest, ze względu na różne czasy przetwarzania różnych typów zgłoszeń.

Edit - Wydaje się, że RemoteCallbackList jest wspierany przez ArrayMap i tak nie wierzy uporządkowane tak?

Nie mogę znaleźć żadnego udokumentowanego sposobu zawężenia miejsca, w którym powstało wywołanie zwrotne w RemoteCallbackList, chociaż nawet gdybym mógł, oczywiście potrzebowałbym jakiegoś stałego identyfikatora, aby wiedzieć, czego szukałem ... Stumped .

Dzięki za przeczytanie tej pory, wszelkie pomysły są mile widziane.

Edytuj - W celu pseudo przykład. Wyobraź sobie, że żądania API dotyczą książek.

// requests 
bookExists(String title) 
bookContent(String title) 

// response 
bookExists(boolean exists) 
bookContent(ArrayList<String> words, int pageTotal) 

Jak widać z powyższego, wszystkie rzeczy są równe, zdalny wniosek o mniejszej książki lub istnienie książki, może wypełnić i być gotowe do reagowania przed wniosku przez dłuższy książce nawet jeśli został o to poproszony. To tutaj muszę śledzić "requester" i jest to projekt, do którego dążę.

+0

Czy możesz wyjaśnić, czy chcesz wysłać wywołanie zwrotne do podzbioru odbiorników, czy też chcesz wysłać różne dane do każdego z odbiorników? – RocketRandom

+0

@RocketRandom Byłoby unikatowe dane dla każdego – brandall

+0

Możesz zachować HashMap , gdzie CustomMsgReceiverInfo to struktura danych, której możesz użyć do rozróżnienia danych, które chcesz wysłać. Osoba dzwoniąca przekaże to w rejestrze Wywołanie połączenia. – RocketRandom

Odpowiedz

2

Jeśli dobrze zrozumiałem, wszystko, co musisz zrobić, to odpowiedzieć na twoje żądania z RemoteCallbackList przy użyciu tego samego interfejsu, ale z różnymi strukturami danych odpowiadających.

Domyślam się, że najprościej jest wysłać prośbę o informacje, jaki rodzaj zwracanej struktury danych chcą. Najbardziej oczywistym (może nawet głupim) sposobem jest wysłanie Ci nazwy klasy, którą musisz utworzyć i wypełnić. W bardziej wyrafinowany sposób możesz po prostu utworzyć wyliczenie, którego nazwę przedmiotu należy podać na żądanie, a które określi właściwą klasa struktury danych, która ma być instancjonowana i zwrócona.

Drugi sposób to posiadanie jakiegoś rozwiązania do rozwiązywania problemów - pewnej logiki, która wykryje, jakiego rodzaju danych może żądać. Ale IMHO wydaje się zbyt niejednoznaczny, dość skomplikowany i mało wygodny w obsłudze.

W każdym razie - jest dość wątpliwe, że znajdziesz uniwersalne rozwiązanie dla takiego przypadku, ponieważ nie jest ono powszechne.

Mam nadzieję, że to pomoże.

+0

Dziękuję za odpowiedź. Żądania wysyłają oczekiwany typ odpowiedzi, określony przez API (metodę) wywoływaną przez AIDL. Wiele wniosków o tym samym typie odpowiedzi może być jednak wysłanych jednocześnie, co nadal pozostawia pierwotne pytanie, która z gotowych odpowiedzi powinna zostać wysłana, do którego callback/binder. – brandall

+0

Myślę, że to tylko kwestia pamięci podręcznej. Chodzi mi o to, że możesz po prostu zachować przygotowane odpowiedzi w nadziei, że niektóre z nowych wniosków mogą je uzyskać. – domax

+0

Dodałem zmianę do mojego pytania - pamięć podręczna nie jest tutaj odpowiednia, ponieważ dane odpowiedzi są inne. – brandall

Powiązane problemy