首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android -检查我的应用程序的其他用户是否连接到互联网的最佳方法是什么?

Android -检查我的应用程序的其他用户是否连接到互联网的最佳方法是什么?
EN

Stack Overflow用户
提问于 2019-08-08 21:40:51
回答 1查看 35关注 0票数 0

我正在为android开发一个社交网络应用程序,在其中我想检查另一个人,他的个人资料正在被查看(并安装了我的应用程序)是否连接到互联网。他可能在运行我的应用程序,也可能没有,这都无关紧要。我唯一关心的是互联网的连通性。如果另一个人没有连接到互联网,则会向用户显示一个消息框,告知该人当前不可用。

所以我有两个问题:

1)是否可以检查对方的网络连接?

2)如果是,最好的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-08-08 22:05:28

你可以这样做

代码语言:javascript
运行
复制
InternetChecker.canReachServer(URL_SERVER, 10000, 10000, reachable -> {
                if(reachable){
                    //connected
                }
                else{
                    //no connected
                }
            });


public class InternetChecker {

public static void canReachServer(String Url, int dnsTimeout, int requestTimeout, Callback<Boolean> result) {
    httpThread.run(() -> {
        InetAddress ip = ResolveHost(Url, dnsTimeout);
        if (ip == null) {
            Log.d("INTERNET STEP 1", "FAILED");
            result.callback(false);
        } else {
            Log.d("INTERNET STEP 1", "SUCCESS: " + ip.getHostAddress());
            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(requestTimeout, TimeUnit.MILLISECONDS)
                    .writeTimeout(requestTimeout, TimeUnit.MILLISECONDS)
                    .readTimeout(requestTimeout, TimeUnit.MILLISECONDS)
                    .build();

            Request request = new Request.Builder()
                    .url(Url)
                    .head()
                    .build();

            try {
                client.newCall(request).execute();
            } catch (IOException e) {
                Log.d("INTERNET STEP 2", "FAILED: " + e.getMessage());
                result.callback(false);
                return;
            }

            Log.d("INTERNET STEP 2", "SUCCESS");
            result.callback(true);
        }

    });
}

public static InetAddress ResolveHost(String sUrl, int timeout) {

    //Run the DNS resolve method manually to be able to time it out.
    URL url;
    try {
        url = new URL(sUrl);
    } catch (MalformedURLException e) {
        return null;
    }
    //Resolve the host IP
    DNSResolver dnsRes = new DNSResolver(url.getHost());
    Thread t = new Thread(dnsRes);
    t.start();
    try {
        t.join((long) (timeout));
    } catch (InterruptedException e) {
        //DNS interrupted
        return null;
    }
    InetAddress inetAddr = dnsRes.get();
    if (inetAddr == null) {
        //DNS timed out.
        return null;
    }
    //DNS resolved.
    return dnsRes.inetAddr;
}

public static class DNSResolver implements Runnable {
    private String domain;
    private InetAddress inetAddr;

    public DNSResolver(String domain) {
        this.domain = domain;
    }

    public void run() {
        try {
            InetAddress addr = InetAddress.getByName(domain);
            set(addr);
        } catch (UnknownHostException e) {
        }
    }

    public synchronized void set(InetAddress inetAddr) {
        this.inetAddr = inetAddr;
    }

    public synchronized InetAddress get() {
        return inetAddr;
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57414017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档