如何等待 webApi 响应并从改造队列中获取结果?

问题描述 投票:0回答:1

我使用以下函数从网络服务检查用户名和密码。我想在不同的活动中使用这个功能。但在我收到服务器响应之前,该函数已到达末尾并返回 false。请建议我使用示例代码解决此问题的方法。

谢谢你。

public boolean checkUserPass(String username, String password) {
    userExist = false;
    UserModel user = new UserModel();
    user.setUsername(username);
    user.setPassword(password);
    Assistant.assistant.client.userCheck(user).enqueue(new Callback<Boolean>() {
        @Override
        public void onResponse(@NonNull Call<Boolean> call, @NonNull Response<Boolean> response) {
            if (response.isSuccessful()) {
                userExist = response.body();
                Log.i("MyTag", response.body().toString());
            } else {
                Log.i("MyTag", "Not Success " + response);
            }
        }

        @Override
        public void onFailure(Call call, Throwable throwable) {
            Log.e("MyTag", "Fail");
        }
    });
    return userExist;
}

我搜索了所有帖子,但没有得到正确的答案。

java api retrofit wait enqueue
1个回答
0
投票

void enqueue(Callback<T> callback)

异步发送请求并通知回调其响应,或者如果与服务器通信、创建请求或处理响应时发生错误。

如果需要等待响应,请勿进行异步调用。请改用

execute()
方法。

同步发送请求并返回其响应。

事实上,在您的情况下,当您需要等待结果时异步发送请求不是一个选择。使用

checkUserPass()
方法实现
execute()
可能如下所示:

public boolean checkUserPass(String username, String password) {
    userExist = false;
    UserModel user = new UserModel();
    user.setUsername(username);
    user.setPassword(password);

    Response<Boolean> resp = Assistant.assistant.client.userCheck(user).execute();
    userExists = resp.body();

    return userExist;
}

当您需要根据收到的响应在后台执行/更新某些操作时,请使用

enqueue
。一个通用的例子如下:

// Callback implementation to asynchronously update the resource as soon as a response is received.
public class MyCallback implements Callback<MyDto> {

    private ResourceToUpdate resourceToUpdate;

    public MyCallback(ResourceToUpdate resourceToUpdate) {
        this.resourceToUpdate = resourceToUpdate;
    }

    @Override
    public void onResponse(Call<MyDto> call, Response<MyDto> response) {
        MyDto myDto = response.body();
        resourceToUpdate.updateWith(myDto);
    }

    @Override
    public void onFailure(Call<MyDto> call, Throwable throwable) {
        Logger logger = Logger.getLogger(MyCallback.class.getSimpleName());
        logger.log(Level.SEVERE, throwable.getLocalizedMessage());
    }
}


// Controller that asynchronously updates the resource via the custom Callback
public class MyController {

    ResourceToUpdate resourceToUpdate;
    MyApi client;
    
    public MyController(Retrofit retrofit){
        resourceToUpdate = new ResourceToUpdate();
        client = retrofit.create(MyApi.class);
    }

    public void updateResourceInTheBackground() {
        client.myRequest().enqueue(new MyCallback(resourceToUpdate));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.