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

标签 java android synchronization retrofit2

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

相关文章:

java - 如何使用java中的套接字从服务器向特定客户端发送字符串消息?

java - 为什么 Ant 编译的 Java 源代码的目标 Java 版本具有未定义的方法

android - 在 Android 上,在用户退出或使用另一个应用程序然后返回后,我如何能够执行一些代码几秒钟?

android - 无法在 Android Studio 中设置断点

javascript - 同步 异步进行 异步调用

java - Java中的平台库是什么

Android ListView 添加太多项目

java - 将多个回调处理到一个接收器函数中的最有效方法

java - Spring中的同步事务方法

java - 无法在 Facebook 中使用 WebviewHitResults 抓取 webview 中的图像 URL