【问题标题】:Java synchronized return when a network call finishes网络调用完成时 Java 同步返回
【发布时间】:2019-06-12 06:35:57
【问题描述】:

我有一个方法intercept,它需要一个响应对象作为回报。

@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 中返回一个字符串。反过来,我将其作为标题添加到mRequestBuilder。 现在,由于网络调用需要一些时间才能完成,所以我只想在网络调用完成(成功或失败)后执行Request request = mRequestBuilder.build()

如何同步这个操作?

【问题讨论】:

  • @SantanuSur 因为 onSuccess 有 void 返回类型。你不能从那个方法返回任何东西。
  • @GhostCat 不,不是。而且由于它是库代码的一部分,我无法同步它。
  • @Rajkiran 记录在案:您对“void”返回类型的评论没有抓住重点。你将一个匿名内部类传递给getToken()。您的代码不会调用这些方法,因此您的代码不会收到潜在的结果,即使 onSuccess() 会返回一些东西!
  • @GhostCat 你的答案在哪里?此外,您的评论已被删除,其中有建议。
  • @Rajkiran 添加了答案.. 希望对您有所帮助..

标签: java android synchronization retrofit2


【解决方案1】:

我只想在之后执行请求request = mRequestBuilder.build() 网络调用完成(成功或失败)。

如何同步这个操作?

您要么等待(阻塞)直到网络调用完成,要么在回调本身中执行request = mRequestBuilder.build();...

如果您在主/GUI 线程上执行等待/阻塞不是一个好主意。

在回调中运行代码也可能不是一个好主意,因为回调可能在某个网络线程中运行,您绝对不应该在该线程上调用chain.proceed()

因此,唯一干净的方法是在某个适当的点/时间运行网络请求以首先获得结果,并且只有在该结果可用之后才允许调用依赖于它的代码。

我故意不在这里包含如何阻止等待来自异步回调的信号的示例,因为如果它可能碰巧在 GUI 线程上运行,您真的不应该使用这种阻塞。

【讨论】:

  • 拦截器如何返回响应?如果构建器在回调方法中?
猜你喜欢
  • 2020-02-27
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
相关资源
最近更新 更多