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ążę.
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
@RocketRandom Byłoby unikatowe dane dla każdego – brandall
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