Что не так с моим кодом для проверки, если сайт в сети или нет? - PullRequest
0 голосов
/ 09 апреля 2019

Я работал над приложением для моего проекта колледжа.В этом приложении я просто хочу проверить, доступен ли сайт (онлайн) или нет.Если он доступен, откройте его в веб-представлении, а если он не открыт, - на предварительно указанном веб-сайте.

После некоторых исследований я обнаружил следующий код, но он, похоже, не работает.Приложение всегда открывается на bing.com (т.е. значение флага не обновляется после запуска pingHost)

public class MainActivity extends Activity {

    WebView web1;
    String Address;
    int flag=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timer repeatTask = new Timer();
        repeatTask.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        pingHost("http://www.google.com", 80, 5000);
                        if (flag==1) {
                            web1 = (WebView) findViewById(R.id.webView1);
                            Address = "https://learn2lead.home.blog";
                            WebSettings webSetting = web1.getSettings();
                            webSetting.setBuiltInZoomControls(true);
                            webSetting.setJavaScriptEnabled(true);
                            web1.setWebViewClient(new WebViewClient());
                            web1.loadUrl(Address);
                        } else if (flag==0){
                            web1 = (WebView) findViewById(R.id.webView1);
                            Address = "http://bing.com";
                            WebSettings webSetting = web1.getSettings();
                            webSetting.setBuiltInZoomControls(true);
                            webSetting.setJavaScriptEnabled(true);
                            web1.setWebViewClient(new WebViewClient());
                            web1.loadUrl(Address);
                        }
                    }
                });
            }
        }, 0, 10000);

    public void pingHost(final String host, final int port, final int timeout) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try (Socket socket = new Socket()) {
                    socket.connect(new InetSocketAddress(host, port), timeout);
                    flag = 1;
                } catch (IOException e) {
                    flag = 0;
                }
            }


        }).start();
    }
}

1 Ответ

0 голосов
/ 09 апреля 2019

Попробуйте

public class MainActivity extends Activity {

WebView web1;
String Address;
int flag = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Timer repeatTask = new Timer();
    repeatTask.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            if (isInternetAvailable()){
                flag = 1;
            }else{
                flag = 0;
            }
            System.out.println("pingHost flag: " + flag );
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (flag == 1) {
                        web1 = (WebView) findViewById(R.id.webView1);
                        Address = "https://learn2lead.home.blog";
                        WebSettings webSetting = web1.getSettings();
                        webSetting.setBuiltInZoomControls(true);
                        webSetting.setJavaScriptEnabled(true);
                        web1.setWebViewClient(new WebViewClient());
                        web1.loadUrl(Address);
                    } else if (flag == 0) {
                        web1 = (WebView) findViewById(R.id.webView1);
                        Address = "http://bing.com";
                        WebSettings webSetting = web1.getSettings();
                        webSetting.setBuiltInZoomControls(true);
                        webSetting.setJavaScriptEnabled(true);
                        web1.setWebViewClient(new WebViewClient());
                        web1.loadUrl(Address);
                    }
                }
            });
        }
    }, 0, 10000);
}

public boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = InetAddress.getByName("google.com");
        //You can replace it with your name
        return !ipAddr.equals("");

    } catch (Exception e) {
        return false;
    }
}
}

Изменили опубликованный вопрос, чтобы он работал.

Но при реализации вы должны подумать о закрытии этой задачи таймера и подумать, что это действительно необходимо 10секундный период.


чтобы проверить, доступен ли интернет, это очень надежно и быстро

public boolean isInternetAvailable() {
        try {
            int timeoutMs = 1500;
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

            sock.connect(sockaddr, timeoutMs);
            sock.close();

            return true;
        } catch (IOException e) { return false; }
    }

проверка: https://stackoverflow.com/a/27312494/1025070

...