Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
#1

Как правильно вставить AlertDialog, если нет интернета? - Программирование Android

20.01.2015, 22:19. Просмотров 1860. Ответов 42
Метки нет (Все метки)

Здравствуйте!Как правильно вставить AlertDialog если нет интернета?
Т.е. я через webView (wv) гружу сайт и если есть инет,то все идет дальше и в wv грузится сайт. Если жк инет нет вылетает AlertDialog о том,что нужно включить инет и обновить страницу.

Я пробовал вот так,но у меня диалог на диалог лезет...даже если например инет включен,то AlertDialog лезет на ProgressDialog.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 webview = (WebView) findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            public void onLoadResource (WebView view, String url) {
                if (mProgressDialog == null) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }  else {
                    AlertDialog alertDialog = new AlertDialog.Builder(Second.this).create();
                    alertDialog.setTitle("Нет доступа в интернет!");
                    alertDialog.setMessage("Включите моб.данные и нажмите кнопку обновить);
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    alertDialog.show();
                }
            }
            public void onPageFinished(WebView view, String url) {
                if (mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
        });
        webview.loadUrl("http://google.ru");
    }
Заранее спасибо.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
20.01.2015, 23:02     Как правильно вставить AlertDialog, если нет интернета? #2
Странно проверять наличие доступа в "интернет" по инициализации mProgressDialog...

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
 
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null && activeNetwork.isConnected()) {
            try {
                URL url = new URL("http://www.google.com/");
                HttpURLConnection urlc = (HttpURLConnection) url
                        .openConnection();
                urlc.setRequestProperty("User-Agent", "test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1000); // mTimeout is in seconds
                urlc.connect();
                if (urlc.getResponseCode() == 200) {
                    Toast.makeText(context, "Internet connection is Ok",
                    Toast.LENGTH_SHORT).show();
                    return true;
                } else {
                    Toast.makeText(context,
                    "Please, check your internet connection",
                    Toast.LENGTH_SHORT).show();
                    return false;
                }
            } catch (IOException e) {
                Toast.makeText(context, "Warning" + "\n"+
                "Error checking internet connection \n"+
                 e.toString(), Toast.LENGTH_SHORT).show();
                return false;
            }
        } else {
            Toast.makeText(context, "Check your network connection",
                    Toast.LENGTH_SHORT).show();
            return false;
        }
    }
Добавлено через 3 минуты
О..еще ж разрешение в манифест надо добавить тогда

XML
1
2
<uses-permission
            android:name="android.permission.ACCESS_NETWORK_STATE"/>
(с)пёрто где-то когда-то с stackoverflow...
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 00:29  [ТС]     Как правильно вставить AlertDialog, если нет интернета? #3
Armagedo, Спасибо,но я не совсем понимаю как совместить эти два примера. К примеру если я уберу кусок AlertDialog из прогресса,то все идет как надо. И теперь нужно впихнуть кусок проверки инета из вашего кода и прикрутить к этому сообщение (можно и Toast,но лучше Alert) о том, что сайт не загрузился по причине отсутствия инета.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
21.01.2015, 08:40     Как правильно вставить AlertDialog, если нет интернета? #4
Цитата Сообщение от Kroshandowski Посмотреть сообщение
AlertDialog лезет на ProgressDialog
Выключайте ProgressDialog через progressDialog.dismiss();
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
21.01.2015, 09:32     Как правильно вставить AlertDialog, если нет интернета? #5
Kroshandowski, я бы весь подход поменял. Написал бы проверку на наличие подключения, она выполняется мгновенно. Если подключения нет, дальше можно не грузить.
Дальше изучил бы AsyncTask, применил бы его. Затем во время загрузки рисовал бы progressDialog. По окончании убирал бы его и, может быть, выводил бы сообщение.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 10:02     Как правильно вставить AlertDialog, если нет интернета? #6
Kroshandowski, в принципе CoolMind расписал всё как оно должно быть.

Цитата Сообщение от Kroshandowski Посмотреть сообщение
Спасибо,но я не совсем понимаю как совместить эти два примера
Так, а что непонятно?
Вместо проверки существует ли mProgressDialog проверяйте существует ли подключение к интернет в принципе

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void onLoadResource (WebView view, String url) {
                if (isConnected()) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }  else {
                    AlertDialog alertDialog = new AlertDialog.Builder(Second.this).create();
                    alertDialog.setTitle("Нет доступа в интернет!");
                    alertDialog.setMessage("Включите моб.данные и нажмите кнопку обновить");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    alertDialog.show();
                }
            }
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 19:14  [ТС]     Как правильно вставить AlertDialog, если нет интернета? #7
CoolMind,Armagedo я где-то читал..по-моему на stackoverflow такой коммент (там чувак хотел сделать Asynctask в webview)
Don't use AsyncTask, as you are not in charge of loading the webview. If you want to show a progress dialog, here is how to do it.
И мало где можно найти примеры c AsyncTask...многие примеры содержат методы:
shouldOverrideUrlLoading
onLoadResource
onPageFinished

Может я чего-то не понимаю и это вполне легко сделать для тех,кто это уже полностью освоил или применял в своих приложениях.
Если идти по-порядку и собирать приложение по кускам вместе с вами,то думаю я получу,что изначально задумывалось.
Итак все возможные разрешения в манифесте уже есть.
Далее код который идет в onCreate:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        webview = (WebView) findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            public void onLoadResource (WebView view, String url) {
                if (mProgressDialog == null) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }
            }
            public void onPageFinished(WebView view, String url) {
                if (mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
        });
        webview.loadUrl("file:///android_asset/index.html");
    }
Т.е. данный код подразумевает открытие html файла (да,для загрузки данного файла нужен инет) в независимости от того есть интернет или нет.
Как предлагал Armagedo и CoolMind можно сделать проверку на определение инета еще ДО загрузки всего контента.
Переписываем onLoadResource:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void onLoadResource (WebView view, String url) {
                if (isConnected()) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }  else {
                    AlertDialog alertDialog = new AlertDialog.Builder(Second.this).create();
                    alertDialog.setTitle("Нет доступа в интернет!");
                    alertDialog.setMessage("Включите моб.данные и нажмите кнопку обновить");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    alertDialog.show();
                }
            }
Получается isConnected определяет включен ли инет.
Теперь сам метод isConnected. В каком месте он должен быть?В самом низу или внутри кода?
И что должно находится в методе public static boolean isConnected(Context context)?
Вроде бы все написал,в чем были вопросы.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 20:11     Как правильно вставить AlertDialog, если нет интернета? #8
Цитата Сообщение от Kroshandowski Посмотреть сообщение
CoolMind,Armagedo я где-то читал..по-моему на stackoverflow такой коммент (там чувак хотел сделать Asynctask в webview)
Don't use AsyncTask, as you are not in charge of loading the webview. If you want to show a progress dialog, here is how to do it.
... даже как бы и логично...

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        
        webview = (WebView) findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            public void onLoadResource (WebView view, String url) {
                if ( isConnected(Second.this)) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }
            }
            public void onPageFinished(WebView view, String url) {
                if (mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
        });
        webview.loadUrl("file:///android_asset/index.html");
    }
 
public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
 
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null && activeNetwork.isConnected()) {
            try {
                URL url = new URL("http://www.google.com/");
                HttpURLConnection urlc = (HttpURLConnection) url
                        .openConnection();
                urlc.setRequestProperty("User-Agent", "test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1000); // mTimeout is in seconds
                urlc.connect();
                if (urlc.getResponseCode() == 200) {
                    Toast.makeText(context, "Internet connection is Ok",
                    Toast.LENGTH_SHORT).show();
                    return true;
                } else {
                    Toast.makeText(context,
                    "Please, check your internet connection",
                    Toast.LENGTH_SHORT).show();
                    return false;
                }
            } catch (IOException e) {
                Toast.makeText(context, "Warning" + "\n"+
                "Error checking internet connection \n"+
                 e.toString(), Toast.LENGTH_SHORT).show();
                return false;
            }
        } else {
            Toast.makeText(context, "Check your network connection",
                    Toast.LENGTH_SHORT).show();
            return false;
        }
    }
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
21.01.2015, 20:48     Как правильно вставить AlertDialog, если нет интернета? #9
Kroshandowski, согласен, тут я дал маху, забыл, что речь только о WebView.
Я имел в виду несколько другой метод для определения подключения, чем указал Armagedo, у меня в программе проверяется только подключение к Wi-Fi или сотовым сетям (без проверки наличия там Интернета). Пытался в своё время сделать нормальную проверку на наличие Интернета, выставлял таймаут, но это можно делать только в фоновом потоке.
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 20:55  [ТС]     Как правильно вставить AlertDialog, если нет интернета? #10
Armagedo, в итоге полный код выглядит вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        webview = (WebView) findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            public void onLoadResource (WebView view, String url) {
                if ( isConnected(Second.this)) {
                    mProgressDialog = new ProgressDialog(Second.this);
                    mProgressDialog.setTitle("Открываем сайт");
                    mProgressDialog.setMessage("Пожалуйста подождите...");
                    mProgressDialog.show();
                }   else {
                    AlertDialog alertDialog = new AlertDialog.Builder(Second.this).create();
                    alertDialog.setTitle("Нет доступа в интернет!");
                    alertDialog.setMessage("Включите моб.данные и нажмите кнопку обновить");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    alertDialog.show();
                }
            }
            public void onPageFinished(WebView view, String url) {
                if (mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
        });
        webview.loadUrl("file:///android_asset/index.html");
    }
 
    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
 
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null && activeNetwork.isConnected()) {
            try {
                URL url = new URL("http://www.google.com/");
                HttpURLConnection urlc = (HttpURLConnection) url
                        .openConnection();
                urlc.setRequestProperty("User-Agent", "test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1000); // mTimeout is in seconds
                urlc.connect();
                if (urlc.getResponseCode() == 200) {
                    Toast.makeText(context, "Internet connection is Ok",
                            Toast.LENGTH_SHORT).show();
                    return true;
                } else {
                    Toast.makeText(context,
                            "Please, check your internet connection",
                            Toast.LENGTH_SHORT).show();
                    return false;
                }
            } catch (IOException e) {
                Toast.makeText(context, "Warning" + "\n"+
                        "Error checking internet connection \n"+
                        e.toString(), Toast.LENGTH_SHORT).show();
                return false;
            }
        } else {
            Toast.makeText(context, "Check your network connection",
                    Toast.LENGTH_SHORT).show();
            return false;
        }
    }
Но когда я запускаю Second активити,то приложение вылетает и Logcat пишет:
01-21 17:50:08.324: ERROR/AndroidRuntime(742): FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.pimpim.Second$1.onPageFinished(Second.java:82)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:274)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 21:17     Как правильно вставить AlertDialog, если нет интернета? #11
Ну, возьмите контекст у WebView

Java
1
if ( isConnected(view.getContext()))
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 21:39  [ТС]     Как правильно вставить AlertDialog, если нет интернета? #12
Armagedo, все равно приложение вылетает и та же ошибка в Logcat(((
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 21:46     Как правильно вставить AlertDialog, если нет интернета? #13
Давайте сюда код для onPageFinished
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 21:51  [ТС]     Как правильно вставить AlertDialog, если нет интернета? #14
Armagedo,
Java
1
2
3
4
5
6
 public void onPageFinished(WebView view, String url) {
                if (mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2015, 21:56     Как правильно вставить AlertDialog, если нет интернета?
Еще ссылки по теме:
Android AlertDialog и RadioGroup
Android Закрытие AlertDialog
Потоки и AlertDialog Android
Custom AlertDialog Android
Android AlertDialog Error

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 21:56     Как правильно вставить AlertDialog, если нет интернета? #15
Аааааа, пилятъ, не увидел...

А так?

Java
1
2
3
4
5
public void onPageFinished(WebView view, String url) {
                if ((mProgressDialog!=null)&&mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
Yandex
Объявления
21.01.2015, 21:56     Как правильно вставить AlertDialog, если нет интернета?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru