Asynchroniczne wywołanie metody

0

Chciałabym wywołać metode2 po zakończeniu metody1, z tym że metoda1 powinna się wykonać na innym wątku niż główny, a metoda2 na głównym wątku.

private void method1() throws InterruptedException {
    //SimulateLongOperation
    Thread.sleep(5000);
    System.out.println("hello1");
}

private void method2(){
    System.out.println("hello2");
}

Podobno takie coś można osiągnąc za pomocą RxJavy, jednak w internecie brak prostych przykładów, kilkustronne artykuły czy 50 minutowe poradniki na YT to dla mnie zbyt trudne, w dodatku zawsze pokazują na przykładach związanych z API i bazą danych.
Czy mogłabym prosić o proste rozwiązanie na moim przykładzie ?

1

Ale chcesz to zrobić za pomocą RxJavy czy po prostu na innym wątku? Bo użycie RxJavy do czegoś takiego jest trochę nadmiarowe.

Twój przykład jest zbyt akademicki, bo nie wiadomo gdzie te dwie metody się znajdują, a ma to duży wpływ na to, jakichś abstrakcji należy użyć i jak ich należy użyć do rozwiązania problemu. Czy obie są w tej samej klasie, czy te klasy są zależne od Androida, jeśli są zależne to jakie jest minSdk, gdzie metody są wywoływane itd.

0

Metody te są wywoływane w presenterze, nie są zależne od Androida. Po prostu długo trwają :)
Tak, chciałabym na siłę użyć RxJavy wykorzystując 2 wątki, z tego co widziałam to subsribeOn(Schedulers.io) i observeOn(AndroidSchedulers.mainThread) ale co dalej, niestety nie wiem.
Przy okazji zapytam, jaki wpływ ma minSDK do takiej sytuacji ?

2

Najlepiej jakby te metody coś zwracały zamiast void. Wtedy łatwiej o kompozycję i testowalność. Ale jak już jest jak jest to mogłabyś zrobić coś takiego (zakładam że RxJava 2).

final class Presenter {
  private void method1() throws InterruptedException {
    //SimulateLongOperation
    Thread.sleep(5000);
    System.out.println("hello1");
  }

  private void method2(){
    System.out.println("hello2");
  }

  Completable foo() {
    return Completable.fromAction(this::method1)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .andThen(Completable.fromAction(this::method2));
  }
}

Tylko kilka uwag to tego:

  • Takie bezpośrednie odwoływanie się do schedulerów jest trochę kiepskie. Lepiej byłoby je np. przekazać z zewnątrz do prezentera. W RxJavie jeszcze nie jest tak źle, bo na potrzeby testów można je globalnie ustawić, ale trochę to mało eleganckie.
  • Moim zdaniem to, że prezenter jest świadom głównego wątku aplikacji, jest błędne. Podejrzewam, że problemem jest funkcja method2(), która robi coś z widokiem. Widok sam mógłby zadbać o to, żeby pracować na głównym wątku. Ewentualnie można rozwiązać to przekazując scheduler z zewnątrz do prezentera w konstruktorze albo jako parameter foo().
  • Schedulers.io() może być tu nieodpowiednie i lepsze może być np. Schedulers.computation() albo jakaś własna pula wątków. Ciężko stwierdzić bez wiedzy o tym, co robi method1().
wioletta90 napisał(a):

Przy okazji zapytam, jaki wpływ ma minSDK do takiej sytuacji ?

Pytałem o to, bo nie wiedziałem czy chcesz koniecznie z RxJavy skorzystać. Powyżej SDK 23 można użyć jako asynchronicznego prymitywu np. CompletableFuture.

1

Kolejny argument za przejściem na Kotlina. Rozwiązanie asynchroniczności stanowią tam coroutines, i nie trzeba dołączać do projektu RxJavy. Która jest biblioteką wielce zacną i porządną, ale stosowanie jej wyłącznie do tego, by wrzucić coś na inny wątek, to trochę strzelanie z armaty do wróbli.

0
V-2 napisał(a):

Kolejny argument za przejściem na Kotlina. Rozwiązanie asynchroniczności stanowią tam coroutines, i nie trzeba dołączać do projektu RxJavy. Która jest biblioteką wielce zacną i porządną, ale stosowanie jej wyłącznie do tego, by wrzucić coś na inny wątek, to trochę strzelanie z armaty do wróbli.

Właśnie jestem na rozstaju dróg.
Zaczęłam robić projekt w Kotlinie, ale w trakcie stwierdziłam, że może jednak zdobędę wiedzy z rxJavy - w gotowych aplikacjach z githuba, które sa napisane w kotlinie, nadal zawierają rxjave :(
Gdy zobaczyłam coroutines 1 raz, w przeciwieństwie do rxJavy od razu zrozumiałam o co w tym chodzi.

Myślicie, że coroutines są w stanie zastąpić rxJave w nowych projektach ?

2

To zależy, do czego jest potrzebna. W zakresie zarządzania wątkami tak. Ale to jest drobna część tego, do czego służy RxJava. Aczkolwiek najczęściej używana część.

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