Android:DNS Java SRV查找在网络连接更改时失败

Android:DNS Java SRV查找在网络连接更改时失败,java,android,dns,Java,Android,Dns,大家星期五快乐 我的Android应用程序依赖DNS Java执行SRV查找。我们刚刚发现,如果网络连接从LTE切换到WiFi,或者从LTE切换到WiFi,那么无论新网络上是否再次建立互联网连接,此后的每次查找都将永久超时。有时,通过切换回旧网络可以解决此问题,但如果更改次数过多,则无法恢复。下面是我们正在使用的代码 如果我能提供任何其他细节,请让我知道。非常感谢您的帮助 private static class ConfigUpdater extends AsyncTask<Void,

大家星期五快乐

我的Android应用程序依赖DNS Java执行SRV查找。我们刚刚发现,如果网络连接从LTE切换到WiFi,或者从LTE切换到WiFi,那么无论新网络上是否再次建立互联网连接,此后的每次查找都将永久超时。有时,通过切换回旧网络可以解决此问题,但如果更改次数过多,则无法恢复。下面是我们正在使用的代码

如果我能提供任何其他细节,请让我知道。非常感谢您的帮助

private static class ConfigUpdater extends AsyncTask<Void, Void, JsonConfig> {
    private static final String SRV_RUE_CONFIG_PREFIX = "_rueconfig._tls.";
    ConfigListener listener;
    String request_url;
    String query_url;
    String username, password;
    String errorMsg;

    public ConfigUpdater(String url, String username, String password, ConfigListener listener) {
        this.username = username;
        this.password = password;
        this.listener = listener;
        query_url = SRV_RUE_CONFIG_PREFIX + url;
        errorMsg = "Failed to Login";
        org.xbill.DNS.ResolverConfig.refresh();
    }

    @Override
    protected JsonConfig doInBackground(Void... params) {
        Record[] records;// = new Record[0];
        try {
            Lookup configLookup = new Lookup(query_url, Type.SRV);
            configLookup.setCache(null);
            records = configLookup.run();
        } catch (TextParseException e) {
            e.printStackTrace();
            return null;
        }
        if(records != null && records.length > 0) {
            for (Record record : records) {
                SRVRecord srv = (SRVRecord) record;
                String hostname = srv.getTarget().toString().replaceFirst("\\.$", "");
                request_url = "https://" + hostname + "/config/v1/config.json";
                Log.d("Auto Config request_url: "+request_url);
            }

            try {
                String reponse_str = getFromHttpURLConnection();
                Log.d("Auto Config JSON: "+reponse_str);
                return parseJson(username, reponse_str, request_url);
            } catch (Throwable e){
                Log.d("Issue parsing json");
                e.printStackTrace();
            }
        }
        return null;
    }

对于任何可能在网络切换后遇到SRV查找失败的人,我似乎已经找到了问题所在。问题在于查找对象上的解析器属性似乎缓存了网络配置。如果要确保查找始终具有最新的网络配置,只需重新初始化新的解析器即可。通过下面的修改,我无法复制任何初始测试用例

Record[] records = null;// = new Record[0];
        try {
            Lookup configLookup = new Lookup(query_url, Type.SRV);
            configLookup.setResolver(new ExtendedResolver()); /** FIX **/
            records = configLookup.run();
        } catch (TextParseException e) {
            e.printStackTrace();
            return null;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

谢谢它适用于我的ResolverConfig.refresh;更改连接的我的代码:org.xbill.DNS.ResolverConfig.refresh;lookup.setResolvernew ExtendedResolver;