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

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

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

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

20.01.2015, 22:19. Просмотров 1874. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2015, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно вставить AlertDialog, если нет интернета? (Программирование Android):

Как правильно определить IP устройства, которое заходит с мобильного интернета - Программирование
Беда просто нереальная: чел пользуется мобильным нетом, живёт в Ростове - там у него на выходе IP №1, заходит на сайт - там у него уже IP...

Как сделать такое AlertDialog - Программирование Android
Помогите сделать вот такой AlertDialog или (не знаю что они использовали). Работает так нажимаещ ImageButton открываеться такое типа...

Как сделать AlertDialog со списком с цветными строками? - Программирование Android
Вопрос новичка. Собственно subj. Есть список из десятка ЦВЕТОВ, которые нужно выбирать из списка. Из выпадающего списка или по нажатию...

Как менять message AlertDialog в зависимости от progress SeekBar? - Программирование Android
Доброго времени суток) В моём приложении при нажатии на TextVeiw появляется AlertDialog, в который я всунул SeekBar. Нужно, чтобы message...

Загрузка картинок Picasso из дискового кэша, когда нет интернета - Программирование Android
Подскажите как можно при помощи Picasso реализовать загрузку картинок в фон активити, когда нет интернета? public class MainActivity...

Как установить лицензионный Metro 2033, если нет интернета? - Action/FPS игры
Привет всем! Я живу в сельской северной местности, где интернет только в школе и на почте (спутниковый), а сотовой связи вообще нет (да,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 15:29  [ТС] #31
Armagedo, вы меня конечно извините,но некий сарказм, при объяснении новичку чего либо в той или иной сфере,не уместен.
Что, в принципе, - фонарный столб для проверки возможности загрузки из сети интернет и с полезностью, стремящейся к бесконечно малой величине
Если какой-то способ не правильный или расходится с общепринятыми правилами андройд разработки,то лучше написать что-то вроде: "Это не правильно,лучше сделать вот так" или "Я бы не использовал данный способ" или вообще кинуть какие нибудь статьи на прочтение,если не хотите изъяснить понятные и очевидные вам вещи.

P.S. Все что я написал выше,это не относится к понятию "Бомбануло" или "Обиделся". Критику я воспринимаю хорошо и даже прошу совета,как сделать лучше.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
22.01.2015, 15:32 #32
Kroshandowski, ту функцию, которую я написал (взял со stackoverflow), можно использовать на первоначальном этапе для проверки, есть ли у устройства какое-то соединение. И если есть, можно делать дальнейшие проверки и загрузки. Как правильно упомянул Rube, требуется дополнительное разрешение. Поэтому вы можете не применять этот способ, как правильно отметил Armagedo. (Ещё раз: если есть подключение к Wi-Fi, но роутер не раздаёт Интернет, то проверка будет пройдена).
Более правильным будет вариант с проверкой по таймауту, предложенный Armagedo. В этому случае, если телефон ни к чему не подключён, всё равно будет тратиться одна секунда. Поэтому вам требуется либо совместить оба подхода, либо использовать только вариант Armagedo. Я не пробовал работу с Thread, только с AsyncTask, поэтому кратко прокомментирую.
У него есть 5 методов (для последних версий Андроида): onPreExecute, doInBackground, onPostExecute, onCancelled (отсутствует в старых версиях), onProgressUpdate. Из них вам точно потребуются первые три.
Стандартным способом считается вынос всей логики для работы с интерфейсом в методы onPreExecute и onPostExecute, а фоновой работы - в doInBackground. Обработка doInBackground обязательна. При этом советую не использовать упоминания контролов в doInBackground, по крайней мере, не обновляйте их. Интерфейсная часть там не должна присутствовать (за исключением того случая, когда контрол сам создаётся в doInBackground). Даже просто создание объектов, зависящих от контекста, рекомендую делать в onPreExecute.
В общем, проверку Интернета можете сделать в doInBackground, а заполнение WebView - в onPostExecute.
Но раз уж проверка основана во Thread, можно попробовать всё сделать во Thread.
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 15:35  [ТС] #33
Rube,
Цитата Сообщение от Rube Посмотреть сообщение
А также требует дополнительное разрешение
Какое дополнительное разрешение?
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.01.2015, 15:37 #34
ACCESS_NETWORK_STATE
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 15:40  [ТС] #35
CoolMind, выходит,что проверку isConnected от Armagedo оставляем,а остальную часть переделываем под AsyncTask?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
22.01.2015, 15:42 #36
Rube, ваш вариант IsConnected является частным случаем для 2 соединений. Он, конечно, верный, но проверяет только 2 соединения. Поэтому лучше использовать более общий случай (там цикл по всем соединениям).

Добавлено через 1 минуту
Kroshandowski, видимо, так, но я не могу этого подтвердить, потому что не знаю, как ведёт себя программа, запускающая фоновый процесс из фонового процесса.
Armagedo
22.01.2015, 15:46
  #37

Не по теме:

Kroshandowski, у меня и мысли не было унижать или преумалять чьё-то решение.
Если выпройдете к аналам топика, то увидите, что я честно признаюь, что решение подсмотрено, стырено, позаимствовано, спёрто и прочие синонимы, указывающее на мою нулевую причастность к этому коду, кроме копипаста и лёгкой шлифовки.

Но, раз уж мы хотим быть объективными, то решение проверяющее наличие доступа только в сеть, не дает ответа на вопрос, а есть ли доступ в СЕТЬ ИНТЕРНЕТ.
Вот об этом я и говорю.
Нравится кому-то это или нет, но - это так

И да, напоследок.
Мне совершенно не нравится ваш подход к обучению.
Без обид.
Так вы ничему не научитесь, поскольку в голову откладывается только то, что решил, проговорил и написал сам.
Вот вы знаете, почему у вас в предпоследней редакции кода алертдиалог "закрывался" с третьего раза?
А у меня на приблуде даже с одиннадцатого?
Нет?
То-то же...
Но я-то знаю, я-то знаю

За сим откланиваюсь и отписываюсь.

Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 15:59  [ТС] #38
Armagedo,

Не по теме:


я знаю,что вы это вряд ли прочтете,но все же....
Вот смотрите....это форум т.е. здесь задают вопрос и на него отвечают те,кто знает или решил этот вопрос.
Если кто-то из участников пишет мне в ответ,то я полагаю,что данный человек готов кинуть правильное решение,дать ссылку,подредактировать "говнокодерство" новичков и т.д.
Если Гуру программирования посмотрит на мой вопрос и сочтет,что я должен для начала изучить это,изучить то,почитать здесь или еще где....то он просто пройдет мимо вопроса поймав себя на том,что лучше не вникать в бредни новичка "говнокодера" и ВСЕ!

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

Цитата Сообщение от Armagedo Посмотреть сообщение
Вот вы знаете, почему у вас в предпоследней редакции кода алертдиалог "закрывался" с третьего раза?
А у меня на приблуде даже с одиннадцатого?
Нет?
То-то же...
Но я-то знаю, я-то знаю

Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.01.2015, 19:46 #39
Запустил я эту проверку, вылетает на urlc.connect();
Кликните здесь для просмотра всего текста
01-22 21:42:04.121: E/AndroidRuntime(1477): FATAL EXCEPTION: main
01-22 21:42:04.121: E/AndroidRuntime(1477): android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
at com.example.function.isNetwork.isConnected(isNetwork.java:55)

webview чтоли надо чтоб был?
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 19:49  [ТС] #40
CoolMind, я убрал из этого варианта StrictMode и все остальное оставил как предложил 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.StrictMode;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
 
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class Second extends Activity {
    ProgressDialog mProgressDialog;
    WebView webview;
 
    @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() {
 
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                    if ((mProgressDialog!=null)&&mProgressDialog.isShowing()) {
                    mProgressDialog.dismiss();
                    mProgressDialog = null;
                }
            }
        });
 
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setTitle("Открываем сайт");
        mProgressDialog.setMessage("Пожалуйста подождите...");
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
 
        if (isConnected(this)) {
            webview.loadUrl("file:///android_asset/index.html");
        }   else {
            mProgressDialog.dismiss();
            AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Нет доступа в интернет!");
            alertDialog.setMessage("Включите моб.данные и нажмите кнопку обновить");
            alertDialog.setButton(AlertDialog.BUTTON_POSITIVE,
                                  "OK",
                                  new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                            dialog.cancel();
                                        }
                                  });
            alertDialog.show();
        }
    }
 
 
    public 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)
                    return true;
                else
                    return false;
            } catch (IOException e) {
                return false;
            }
        } else
            return false;
    }
}
Добавлено через 1 минуту
Rube, ну да webview отображает у меня html файлик из asset
Java
1
webview.loadUrl("file:///android_asset/index.html");
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.01.2015, 20:48 #41
Я в смысле для метода isConnected необходимо наличие webview? CoolMind
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
23.01.2015, 09:48 #42
Rube, привет!
android.os.NetworkOnMainThreadException - это означает, что данную функцию надо запускать из фонового потока, о чём мы тут и говорим. Я тоже столкнулся с этим пару месяцев назад и почти на всех форумах не видел, чтобы кто-то прямо сказал, что запускайте из AsyncTask или Thread.
WebView используется позже и из UI-потока.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
23.01.2015, 09:57 #43
Ага, ясно, попробую вечером. А то я запускал проверку перед вызовом AsynkTask.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2015, 09:57
Привет! Вот еще темы с ответами:

Как вставить пробел после знака препинания, если его там нет? - C++
Приветствую! Такую вот программку реализовал. Она считывает строку (как сделать, чтобы считывала сразу текст, и делала это уже везде, а...

Всё правильно, а интернета нет. Чего не хватает? - Windows 7
Всем доброго времени суток! Я первый раз на этом форуме. Возможно, что создал тему не в том разделе. Если что – прошу поправить меня. Но...

Если нет интернета, то ожидать его появления - Visual Basic .NET
Нужно чтобы программа сначала проверяла подключен ли ПК к интернету,если да,то выполнять код дальше,если нет,то ожидать его появления. ...

Заменить значения по WHERE, а если совпадений нет то вставить - PostgreSQL
Приветствую. Можно ли одним запросом выполнить замену строки по совпадению WHERE, а если совпадения нет, то вставить строку? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.01.2015, 09:57
Ответ Создать тему
Опции темы

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