我使用以下函数从网络服务检查用户名和密码。我想在不同的活动中使用这个功能。但在我收到服务器响应之前,该函数已到达末尾并返回 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;
}
我搜索了所有帖子,但没有得到正确的答案。
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));
}
}