Android-программно проверить подключение к интернету и диалоговое окно отображения, если не подключен

Я работаю над живым проектом. и когда пользователь нажимает на приложение. появится экран приветствия (на этом экране есть webview). а если интернет не подключен, то приложение вылетает. В принципе, моя проблема заключается в программной проверке того, что мобильный подключен к интернету или нет. если нет, то не извлекайте данные из webservice в webview и отобразите диалоговое окно с надписью "проверьте подключение к интернету"

во время исследований я нашел много вещей, и я пытался реализовать это. но, это не удовлетворяет моему требованию

мой код,

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    else
    {
        Description.setVisibility(View.INVISIBLE);
        new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(
                getResources().getString(
                        R.string.internet_error))
        .setPositiveButton("OK", null).show();
    }
    return false;
}

Я вызываю эту функцию в doInBackground() of AsyncTask

Пожалуйста, Помогите!

8 ответов


вы можете проверить эту библиотеку:

https://github.com/novoda/merlin

вы просто implement Connectable и вы получите обратный вызов, когда сеть идет вниз или поднимается.

поэтому вы можете показать свой диалог в этом сценарии.

вы можете также запросить библиотеку для текущего состояния и выбрать не Сети задание

example

создать Merlin (используя Кречет.Builder ())

merlin = new Merlin.Builder().withConnectableCallbacks().build(context);

связывать и распутывать сервис в вашей деятельности

@Override
protected void onResume() {
    super.onResume();
    merlin.bind();
}

@Override
protected void onPause() {
    super.onPause();
    merlin.unbind();
}

Регистрация обратных вызовов

merlin.registerConnectable(new Connectable() {
        @Override
        public void onConnect() {
            // Do something!
        }
});

на MerlinActivity в демо показан простой способ разгрузить Мерлен от основного кода приложения.


наконец, я получил ответ.

ConnectivityManager conMgr =  ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null){
    Description.setVisibility(View.INVISIBLE);
    new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(getResources().getString(R.string.internet_error))
        .setPositiveButton("OK", null).show();
}else{
    dialog = ProgressDialog.show(WelcomePage.this, "", "Loading...", true,false);
    new Welcome_Page().execute();
}

это простая функция, которая проверяет ваше подключение к интернету. Если подключено, верните true, иначе false.

 public boolean isInternetOn() {

        // get Connectivity Manager object to check connection
        ConnectivityManager connec =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        // Check for network connections
        if (connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED) {


            return true;

        } else if (
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                        connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED) {


            return false;
        }
        return false;
    }
}

вот проект, который проверяет подключение к интернету, а также проверяет url, который действителен или содержит в sever этой.


проверьте подключение к интернету

 ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo netInfo = mgr.getActiveNetworkInfo();

        if (netInfo != null) {
            if (netInfo.isConnected()) {
                // Internet Available
            }else {
               //No internet
            }
        } else {
            //No internet
        }

Я пробовал разные методы, описанные выше, кроме того, я был пойман в некоторых случаях. Итак, наконец, я использую ниже фрагмент кода для выполнения сетевого вызова...

try {
    InetAddress address = InetAddress.getByName("www.stackoverflow.com");
    //Connected to working internet connection
} catch (UnknownHostException e) {
    e.printStackTrace();
    //Internet not available
}

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


if (InternetConnection.checkConnection(context)) {
    // Internet Available...
} else {
    // Internet Not Available...
}

просто скопируйте ниже класс

public class InternetConnection {

    /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */
    public static boolean checkConnection(Context context) {
        final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();

        if (activeNetworkInfo != null) { // connected to the internet
            Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show();

            if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
                return true;
            } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to the mobile provider's data plan
                return true;
            }
        }
        return false;
    }
}

дайте следующее разрешение на манифест

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

doInBackground работает в другом потоке, чем основной пользовательский интерфейс, поэтому вы не можете создать здесь диалоговое окно. Вместо этого переопределите onPreExecute в своем AsyncTask и сделать тест там.


подключение к Интернету и регистрация в onCreate() или onResume() метод. Нет необходимости звонить внутри AsyncTask.

или вы можете вызвать перед вызовом метода AsyncTask execute ()

if(isOnline)
{
   MyAsyncTask task=new MyAMyAsyncTask();
   task.execute();

}

else
{
// no internet connection
}