[英]How to return value from onResponse
如何从 Retrofit 2 查询返回值或执行类似操作? 我需要返回 isConnected 变量。 问题是当我调用 testConnection() 时,它会自动返回 false,因为尚未处理发送到服务器的请求。 我必须等待请求被处理,但如何处理?
static boolean isConnected = false;
public static boolean testConnection() {
apiInterface = ApiClient.getApiClient().create(Api.class);
Call<String> call = apiInterface.testConnection();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.body().equals("Connected")) {
isConnected = true;
} else {
isConnected = false;
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.d("infomessage", t.getMessage());
isConnected = false;
}
});
return isConnected;
}
enqueue
函数在后台运行你的 API 调用,一个不同的线程。
任何 API 调用都不应该在主线程中完成,这就是您不能从enqueue
返回的原因。
但是,您可以在主线程上就地运行 API 调用。 它不recommonded,因为它会让你的应用程序UI冻结而API调用正在处理连线。
做你想要实现的事情的一种方法是使用一组回调。
您在方法中放置了 2 个参数。 onSuccess
和onFailure
。 两者都是 Lambda, onSuccess
有一个bool
参数,而onFailure
有一个Exception
参数。
这就是你的代码的样子
public static boolean testConnection(Function<Boolean, Void> onSuccess, Function<Exception, Void> onFailure) {
apiInterface = ApiClient.getApiClient().create(Api.class);
Call<String> call = apiInterface.testConnection();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.body().equals("Connected")) {
onSuccess.invoke(true);
} else {
onSuccess.invoke(false);
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.d("infomessage", t.getMessage());
onSuccess.invoke(false);
onFailure.invoke(t);
}
});
return isConnected;
}
在您的用户界面中
testConnection((isConnected) -> {
}, (error) -> {
});
Retrofit 的enqueue
是一个带有异步回调的非阻塞调用。 而是使用execute()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.