首页 文章

有效的方法来检查慢速互联网连接,并区分网络连接和Android中的实际互联网连接

提问于
浏览
1

如何检查设备是否连接到互联网或它是否只是连接到外部wifi网络?因为即使没有网络连接,如果设备连接到外部wifi网络,NetworkInfo也会返回true .

当设备连接到wifi但没有互联网访问时,我的应用程序的网络连接检查类返回true但应用程序崩溃,但它无法访问相应的http网址 .

2 回答

  • 0

    如果您想知道何时有有效的互联网连接,请执行以下操作:

    一些静态变量:

    /**
     * Set the number of retries when reestablishing Internet connection.
     */
    private static int retryConnectionNumber = 0;
    
    /**
     * The maximum number of retries allowed for Internet connection.
     */
    private final static int CONNECTION_RETRY_MAX = 5;
    
    /**
     * The timeout of the HTTP request when checking for Internet connection.
     */
    private final static int REQUEST_TIMEOUT = 2000;
    

    检查网络是否可用的方法:

    private static void isNetworkAvailable(final Handler handler,
                final int timeout) {
            new Thread() {
                private boolean responded = false;
    
                @Override
                public void run() {
                    URL url = null;
                    try {
                        url = new URL("http://your_server_addres.com");
                    } catch (MalformedURLException e1) {
                        e1.printStackTrace();
                    }
                    String host = "";
                    if (null != url) {
                        host = url.getHost();
                    }
    
                    Log.i("NetworkCheck", "[PING] host: " + host);
                    Process process = null;
                    try {
                        process = new ProcessBuilder()
                                .command("/system/bin/ping", "-c 1",
                                        "-w " + (timeout / 1000), "-n", host)
                                .redirectErrorStream(true).start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    InputStream in = process.getInputStream();
                    StringBuilder s = new StringBuilder();
                    int i;
    
                    try {
                        while ((i = in.read()) != -1) {
                            s.append((char) i);
    
                            if ((char) i == '\n') {
                                Log.i("NetworkCheck",
                                        "[PING] log: " + s.toString());
                                if (s.toString().contains("64 bytes from")) {
                                    // If there were a response from the server at
                                    // all, we have Internet access
                                    responded = true;
                                }
                                s.delete(0, s.length());
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        // Destroy the PING process
                        process.destroy();
    
                        try {
                            // Close the input stream - avoid memory leak
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                        // Send the response to the handler, 1 for success, 0
                        // otherwise
                        handler.sendEmptyMessage(!responded ? 0 : 1);
                    }
                }
            }.start();
        }
    

    处理程序:

    /**
     * Handler used that receives the connection status for the Internet.
     * If no active Internet connection will retry #CONNECTION_RETRY_MAX times
     */
    private static Handler listenForNetworkAvailability = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what != 1) { // code if not connected
                Log.i("NetworkCheck", "not connected");
    
                if (retryConnectionNumber <= CONNECTION_RETRY_MAX) {
                    Log.i("NetworkCheck", "checking for connectivity");
                    Here you could disable & re-enable your WIFI/3G connection before retry
    
                    // Start the ping process again with delay
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            isNetworkAvailable(listenForNetworkAvailability, REQUEST_TIMEOUT);
                        }
                    }, 5000);
                    retryConnectionNumber++;
                } else {
                    Log.i("NetworkCheck", "failed to establish an connection");
                    // code if not connected
                }
            } else {            
                Log.i("NetworkCheck", "connected");
                retryConnectionNumber = 0;
                // code if connected
            }
        }
    }
    
  • 1

    像这样的东西会起作用:

    private boolean haveNetworkConnection() {
            boolean haveConnectedWifi = false;
            boolean haveConnectedMobile = false;
    
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo[] netInfo = cm.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                    if (ni.isConnected())
                        haveConnectedWifi = true;
                if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    if (ni.isConnected())
                        haveConnectedMobile = true;
            }
            return haveConnectedWifi || haveConnectedMobile;
        }
    

    我已经从here复制了这段代码(我理解代码 - 我只是在这里添加代码,以方便管理员告诉用户你应该这样做,并归功于原帖) . 我个人会把它分成两个功能,一个用于移动,一个用于wifi,但这个选择取决于你 .

相关问题