Проверка сети Android ненадежна

Кажется, я столкнулся с проблемой, когда проверка сети ненадежна. Я имею в виду, что иногда он возвращает true, когда на самом деле сеть недоступна.

Это происходит в реальных сценариях, когда вы уходите в подполье и теряете сигнал, телефон правильно сообщает об этом, не показывая полос, но проверка все равно возвращает истину.

Я использую следующий код:

    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    boolean isNetworkAvailalbe = (activeNetworkInfo != null);

Я ищу самый пуленепробиваемый способ реализовать надежную проверку сети, какие-либо рекомендации?


person AlexVPerl    schedule 11.02.2015    source источник
comment
Проверьте эту тему, на тот же вопрос уже дан ответ. stackoverflow.com/questions/28448197 /   -  person Dhrumil Shah - dhuma1981    schedule 11.02.2015


Ответы (2)


попробуй с этим..

public static boolean checkNetworkRechability(Context mContext) {
        ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        isInternetAvailable();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    public static boolean isInternetAvailable() {
        Log.i("TAG", "isInternetAvailable start");
        try {
            InetAddress ipAddr = InetAddress.getByName(new URL("google.com").getHost());


            String ip = ipAddr.getHostAddress();
            if (ip.equals("")) {
                return false;
            } else {
                Log.i("TAG", "IP Address : " + ip);
                return true;
            }

        } catch (Exception e) {
            return false;
        }

    }
person Vishal Khakhkhar    schedule 11.02.2015
comment
Спасибо за это - я чувствую, что это хорошая итерация ответа, предоставленного @Sandro. Вы когда-нибудь сталкивались с тем, что этот метод требует больше времени для выполнения при тестировании в полевых условиях? - person AlexVPerl; 15.02.2015
comment
При изучении этого ответа кажется немного громоздким в том смысле, что теперь это должно выполняться в отдельном потоке, поскольку в противном случае генерируется исключение NetworkOnMainTreadException. - person AlexVPerl; 15.02.2015

ConnectivityManager cm =
    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();

На портале для разработчиков Android вы можете найти дополнительную информацию: http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

person Sandro Machado    schedule 11.02.2015
comment
Спасибо за это, я тестирую и отвечу, устранила ли это проблему. - person AlexVPerl; 15.02.2015
comment
Извините за столь долгую задержку с возвращением к этому. Нужно было выйти в поле, чтобы проверить это. И я должен признать, что это случается реже, но все же происходит. Так что это не решает проблему, к сожалению. Спасибо. - person AlexVPerl; 20.03.2015