Piszę program, w którym wykorzystuję bibliotekę Retrofit 2 i komunikuję się z serwerem poprzez wywoływanie asynchronicznych żądań. Poniżej przykład metody:
public void insertUser(final String login, final String password, final String salt, final String email) {
IUserApi userAPI = retrofit.create(IUserApi.class);
final Call<User> user = userAPI.insertUser(login, password, salt, email);
user.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
//zapisanie danych
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
Podczas wywoływania wybranej metody odpowiedzialnej za wymianę informacji z serwerem, program działa następująca: wykonuje wszystko za wyjątkiem enqueue()
, wraca do metody wywołującej, wykonuje pozostałą część kodu tej metody i po jej zakończeniu wykonuje enqueue()
. Stąd wnioskuję, że enqueue()
wpisywane jest do kolejki i wykonywane, gdy wątek wykona pozostałe czynności. Wykonując metodę onResponse()
zapisuję setterem pewne dane, które są potem przetwarzane w innym miejscu programu. I tutaj pojawia się problem, ponieważ te dane otrzymuję za późno, gdy metoda wywołująca zostanie już w całości wykonana. Próbowałam to rozwiązać za pomocą wielowątkowości, np. tworząc obiekt klasy Handler
, jak poniżej:
private void someMethod() {
//w tym miejscu wywołuję metodę odpowiedzialną za komunikację z serwerem
Runnable jsonResponseThread = new Runnable() {
public void run() {
//w tym miejscu czekam na wynik zapisu dokonywanego w metodzie onResponse()
}
};
Handler customHandler = new Handler();
customHandler.post(jsonResponseThread);
//pozostały kod
}
Jednak wszelkie próby kończą się tak samo: wątek nie wykonuje się równolegle do wątku głównego, a zostaje wykonany dopiero po jego zakończeniu.
Czy jest możliwe wykonanie wywołania asynchronicznego na oddzielnym wątku, zwiększenie puli wątków w Retrofit? Co może powodować, że wątki nie działają równolegle?
scibi92