gpt4 book ai didi

当网络调用完成时Java同步返回

转载 作者:行者123 更新时间:2023-12-01 06:01:47 25 4
gpt4 key购买 nike

我有一个方法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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com