【问题标题】:OKHttp DNS lookup asynchronouslyOKHttp异步DNS查找
【发布时间】:2021-03-05 02:50:08
【问题描述】:
public class OkHttpDns implements Dns {
    @NotNull
    @Override
    public List<InetAddress> lookup(@NotNull String hostname) throws UnknownHostException {
        MyLookUpUtility.getInstance.lookup(hostname, new MyLookUpUtility.lookupCallback() 
        {
            @Override
            public void onlookupResponseSuccess(JSONObject nslookupResponseJSON) {
                Log.d("LookupResponse", nslookupResponseJSON.toString());
            }

            @Override
            public void onlookupResponseFailure(String errCode) {
                Log.d("LookupResponse", "Error Code : "+errCode);
            }
        });
    }
}

在上面的代码中,OKHttp的DNS接口的查找方法想要立即返回。但是我的自定义 NSLookupUtility 是一个异步调用,我将在一段时间后获得主机名的 IP 地址。如何解决这个问题呢?如何使同步调用等待其中的异步调用?

【问题讨论】:

    标签: dns okhttp


    【解决方案1】:

    看看CompletableFuture。您将在lookup() 中创建一个实例,启动异步查找,然后调用future.get()。当你的异步调用完成后,调用future.complete()

    【讨论】:

    • 谢谢。我使用 CompletableFuture 来解决这个问题。有效。我会发布我所做的。它会帮助别人。
    【解决方案2】:
        @Override
        public List<InetAddress> lookup(@NotNull String hostName) throws UnknownHostException {
    
            completableFuture = new CompletableFuture<>();
            performLookUp(hostName);
            try {
                String ipAddress = completableFuture.get();
                if (ipAddress != null) {
                    List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ipAddress));
                    return inetAddresses;
                }
            } catch (ExecutionException e) {
                Log.d(TAG, "Error : ExecutionException : "+e );
                e.printStackTrace();
            } catch (InterruptedException e) {
                Log.d(TAG, "Error : InterruptedException : "+e );
                e.printStackTrace();
            }
    
            return Dns.SYSTEM.lookup(hostName);
        }
    
        private void performLookUp(@NotNull String hostName) {
           MyUtiluty.getInstance().lookup(hostName,
                     new MyCallBack() {
    
                        @Override
                        public void onSuccess(String ip) {
                                completableFuture.complete(ip);
                        }
    
                        @Override
                        public void onFailure(String errCode) {
                            completableFuture.complete(null);
                        }
                    });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多