Android 如何在正确的时间调用方法?

Android 如何在正确的时间调用方法?,android,retrofit,Android,Retrofit,有一个简单的请求。在这种情况下,我捕获错误403 .enqueue(new Callback<NewOrderResponse>() { @Override public void onResponse(Call<NewOrderResponse> call, Response<NewOrderResponse> response) {

有一个简单的请求。在这种情况下,我捕获错误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));
                        }
                    }
.enqueue(新的回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==403){
connect.login(manager、manager.getphone()、manager.getpass());
connect.reconnectNewOrder(manager.getsessionid(),newgson().toJson(newOrderRequest));
}
}
我调用login(connect.login(manager,manager.getphone(),manager.getpass());)方法:

.login(登录,passFromSms)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==200){
//保存id会话
Headers header=response.Headers();
List cookieList=header.values(“设置Cookie”);
_jsessionid=(cookieList.get(0.split)(;))[0];
savesession(_jsessionid);
}
}
在这个方法中,我必须保存新的会话id

但是一旦程序进入方法。登录(login,passFromSms)

并执行它,它立即退出该方法(不为我保存会话)并执行该方法:

connect.reconnectNewOrder(manager.getsessionid()、newgson()、toJson(newOrderRequest));

结果表明,这个方法是在旧会话中执行的

  • 程序执行不是顺序的,为什么

  • 问题是什么?我能做些什么使程序按顺序运行,或者有哪些选项


调用响应块中的下一个方法:

 .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));
}
.login(登录,passFromSms)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==200){
//保存id会话
Headers header=response.Headers();
List cookieList=header.values(“设置Cookie”);
_jsessionid=(cookieList.get(0.split)(;))[0];
savesession(_jsessionid);
//在此处调用方法,适当处理失败的响应
重新连接(会话ID);
}
}
//...
//您将从200响应块调用的方法
私有void重新连接(int sessionId){
connect.reconnectNewOrder(sessionId,newgson().toJson(newOrderRequest));
}

调用响应块中的下一个方法:

 .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));
}
.login(登录,passFromSms)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==200){
//保存id会话
Headers header=response.Headers();
List cookieList=header.values(“设置Cookie”);
_jsessionid=(cookieList.get(0.split)(;))[0];
savesession(_jsessionid);
//在此处调用方法,适当处理失败的响应
重新连接(会话ID);
}
}
//...
//您将从200响应块调用的方法
私有void重新连接(int sessionId){
connect.reconnectNewOrder(sessionId,newgson().toJson(newOrderRequest));
}

当您在另一个线程上运行调用排队时,您无法控制首先运行哪个线程,因此您必须等待执行
login
调用并在其回调调用中重新连接neworder或使用
execute()代替
enqueue()
改装方法

当您将在另一个线程上运行的调用排队时,您无法控制首先运行哪个线程,因此您必须等待执行
login
调用,并在其回调调用中重新连接新订单
或使用
execute()代替
enqueue()
改装方法

也许可以通过调用200响应块中的一个方法来解决这个问题?您可以粘贴整个classNo,I enter to connect.login()也许可以通过调用200响应块中的一个方法来解决这个问题?您可以粘贴整个classNo,I enter to connect.login()吗好的软件设计并不总是便于使用。好的软件设计并不总是便于使用。