我有一个方法intercept
,它需要一个 Response 对象作为返回。
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
mRequestBuilder = original.newBuilder();
mAgent.getToken(new OnTokenResponse() {
@Override
public void onSuccess(final String token) {
mRequestBuilder.removeHeader(AUTHORIZATION);
mRequestBuilder.header(AUTHORIZATION, "Bearer " + token);
}
@Override
public void onFailure(final String error) {
}
});
Request request = mRequestBuilder.build();
return chain.proceed(request);
}
mAgent.getToken()
进行网络调用,如果成功,则在 onSuccess 中返回一个字符串。反过来,我将其作为 header 添加到 mRequestBuilder
中。
现在,网络调用需要一些时间才能完成,我想仅在网络调用完成(成功或失败)后才执行 Request request = mRequestBuilder.build()
。
如何同步此操作?
最佳答案
I want to execute Request
request = mRequestBuilder.build()
only after the network call is completed (either success or failure).How can I synchronize this operation?
您要么等待(阻止)直到网络调用完成,要么执行 request = mRequestBuilder.build();...
在回调本身中。
如果您在主/GUI 线程上执行等待/阻塞并不是一个好主意。
在回调中运行代码可能也不是一个好主意,因为回调可能在某些网络线程中运行,并且您绝对不应该调用 chain.proceed()
在该线程上。
因此,唯一干净的方法是在某个适当的点/时间运行网络请求以首先获取结果,并且只有在该结果可用后才允许调用依赖于它的代码。
我故意不包含如何阻止等待来自异步回调的信号的示例,因为如果它可能碰巧在 GUI 线程上运行,您确实不应该使用这种阻塞。
关于当网络调用完成时Java同步返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555970/