Как вызвать метод в нужное время? - PullRequest
1 голос
/ 04 февраля 2020

Есть простой запрос. В условии я ловлю ошибку 403.

.enqueue(new Callback<NewOrderResponse>() {
                    @Override
                    public void onResponse(Call<NewOrderResponse> call, Response<NewOrderResponse> response) {
                        if (response.code() == 403) {
                            connect.login(manager, manager.getphone(), manager.getpass());
                            connect.reconnectNewOrder(manager.getsessionid(), new Gson().toJson(newOrderRequest));
                        }
                    }

И я вызываю логин ( connect.login (manager, manager.getphone (), manager.getpass ()); ) метод:

 .login(login, passFromSms)
                .enqueue(new Callback<AuthResponse>() {
                    @Override
                    public void onResponse(Call<AuthResponse> call, Response<AuthResponse> response) {
                        if (response.code() == 200) {
                            // Save id session
                            Headers header = response.headers();
                            List<String> cookieList = header.values("Set-Cookie");
                            _jsessionid = (cookieList.get(0).split(";"))[0];

                            manager.savesession(_jsessionid);

                        }
                    }

В этом методе мне нужно сохранить новый идентификатор сеанса.

Но как только программа входит в метод .login (login, passFromSms)

и выполняет его, он немедленно выходит из метода (и не сохраняет сеанс для меня) и выполняет метод:

connect.reconnectNewOrder (manager.getsessionid (), new Gson (). to Json (newOrderRequest));

И получается, что этот метод выполняется со старым сеансом.

  • Выполнение программы не является последовательным, почему так?

  • В чем проблема? Что я могу сделать, чтобы программа работала последовательно или какие есть варианты?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

, когда вы ставите вызов в очередь, он выполняется в другом потоке, и вы не можете контролировать, какой поток запустить первым, поэтому вам придется ждать, пока не будет выполнен вызов login и внутри его обратного вызова reconnectNewOrder или вместо enqueue() использовать execute() метод дооснащения

0 голосов
/ 04 февраля 2020

Вызовите следующий метод в блоке ответа:

 .login(login, passFromSms)
                .enqueue(new Callback<AuthResponse>() {
                    @Override
                    public void onResponse(Call<AuthResponse> call, Response<AuthResponse> response) {
                    if (response.code() == 200) {
                        // Save id session
                        Headers header = response.headers();
                        List<String> cookieList = header.values("Set-Cookie");
                        _jsessionid = (cookieList.get(0).split(";"))[0];

                        manager.savesession(_jsessionid);

                        // Call method here, handle failed response appropriately
                        reconnect(_jsessionid);

                    }
                }

//...

// The method you will call from the 200 response block
private void reconnect(int sessionId) {
    connect.reconnectNewOrder (sessionId, new Gson (). toJson(newOrderRequest));
}
...