funkcja callback

0

Witam, piszę aplikację androidową która jest serwerem i jednocześnie biblioteką dla innych aplikacji androidowych., używam localsocket. Z socketem łączy się urządzenie które może wysyłać odpowiednie komendy. Np. pobierz listę użytkowników, pobierz numery kont itp. W bibliotece używam interfejsów które w zależności od tego jaka komenda przyjdzie pobieram dane wołając funkcje z aplikacji która zaimportowała tą że bibliotekę. Również aplikacja zewnętrzna może wywoływać eventy i pobierać coś z urządzenia poprzez moją bibliotekę Struktura jest taka iż w bibliotece mam klasę którą tworzy socekt i łączy się z klientem jest w niej parser który parsuje komendy przychodzące z zewnątrz i wykonuje jakieś zadania.

 public void HandleCommand(Command command, String packet) {
        m_Text = packet;
        switch (command) {
            case req_finish_interaction:
               inishInteraction(packet);
                break;
               .......
           }

Mam problem jak zrobić operację w której mam coś zwrócić gdy aplikacja wywoła zdarzenie, które wysyła zapytanie do urządzenia i czeka aż urządzenie coś zwróci

 public List<DiscountDefinition> EventGetDiscountDefinitions() {
       Globals.discountListPacket=null;
        BuildSendEvent("event_discount_list", "", "");
        while(true)
        {
            if(Globals.discountListPacket!=null)
            break;
        }

Aplikacja woła funkcje EventGetDiscountDefinitions która ma jej zwrócić listę obiektów. I teraz główny wątek nasłuchujący komendy przychodzące do serwera jest w innej klasie, utworzyłem obiekt globalny który resetuje

  Globals.discountListPacket=null;

I gdy przyjdzie na serwer odpowiednia komenda wypełniam go a funkcja czeka w pętli dopóki obiekt będzie różny od null tak jak jest to widoczne powyżej. Czy jest jakiś sposób by zrobić to ładniej, bez robienia pętli itp. ??

0

Wydaje mi się, że taka pętla jest chyba jedynym sensownym sposobem na realizację oczekiwania (mogę się mylić).
Jedyne uproszczenie, jakie mi przychodzi do głowy to zamiast while if dać pusty while(Globals.discountListPacket == null)

0

Niestety nie do końca rozumiem twój problem. Coś strasznie sobie komplikujesz.

  1. Konstrukcja taka jak poniżej
while(true)
        {
            if(Globals.discountListPacket!=null)
            break;
        }

i tak nie ma gwarnacji działania. A w zasadzie ma dużą szansę, żeby nie działać.

  1. Skoro gdzieś możesz ustawić tą zmienna globalną... to równie dobrze tam możesz robić to co masz robić po tym ifie. Problem rozwiązany.
0

Właśnie nie do końca, muszę zwrócić List<DiscountDefinition> którą wypełniam danymi które przychodzą na socket z zewnętrzengo urządzenia, dlatego najpierw zmienną globalną czyszczę następnie w pętli czekam aż zostanie wypełniona (!=null) i wtedy wypełniam List<DiscountDefinition> i ją zwracam

0

W tej sytuacji możesz odwócić sterowanie - wywołaj ten kod co czeka na tą listę...
ale jeśli naprawdę nie mozesz tego zrobić to użyj CompletableFuture. (czyli w zasadzie Callbacka).

0

Sterowania nie mogę odwrócić gdyż mam jeden wątek nasłuchujący na sockecie dane przychodzące z klienta. Słuchać muszę cały czas gdy nie wiem w którym momencie jakieś dane przyjdą, stąd nie mogę w funkcji po wysłaniu zapytania do klienta czekać na odpowiedź tylko ta odpowiedź musi przyjść na główny wątek nasłuchujący na porcie. CompletableFuture nie użyję gdyż nie mogę korzystać z JAVY 1.8.

1 użytkowników online, w tym zalogowanych: 0, gości: 1