Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.01.2015, 22:19. Просмотров 2155. Ответов 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");
    }
Заранее спасибо.
0
Лучшие ответы (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 игры
Привет всем! Я живу в сельской северной местности, где интернет только в школе и на почте (спутниковый), а сотовой связи вообще нет (да,...

42
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 22:10  [ТС] #16
Armagedo, ААААААААААА ЗАРАБОТАЛО!!!!!!!!!!!!!!!!!!!!!!
Осталось два вопроса.
1)Когда я нажимаю OK на сообщении AlertDialog'a, мне приходится нажимать OK трижды. С первого раза диалог не пропадает.
2)mProgressDialog не появляется.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 22:16 #17
Цитата Сообщение от Kroshandowski Посмотреть сообщение
Осталось два вопроса.
Шо? Опять? (с) м/ф "Жил-был пёс"
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 22:26  [ТС] #18
Цитата Сообщение от Armagedo Посмотреть сообщение
Шо? Опять? (с) м/ф "Жил-был пёс"
Нее...как бэ приложение работает и грузит содержимое html файлика,но без "плюшек" таких как прогресс диалог на предзагрузке и нормальное-одинарное нажитие кнопки ОК
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
21.01.2015, 22:29 #19
Давай весь код с самого начала объявления класса...
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
21.01.2015, 22:56  [ТС] #20
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
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() {
 
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            public void onLoadResource (WebView view, String url) {
                if (isConnected(view.getContext())) {
                    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!=null)&&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;
        }
    }
}
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
22.01.2015, 00:51 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
92
93
94
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);
 
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
 
        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("http://www.google.com/");
        }   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
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 01:08  [ТС] #22
Armagedo, большое спасибо за время, потраченное на решение моего вопроса!
Небольшой оффтоп:
Почему именно StrictMode решил проблему?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
22.01.2015, 09:42 #23
Цитата Сообщение от Kroshandowski Посмотреть сообщение
Небольшой оффтоп:
Почему именно StrictMode решил проблему?
Откуда вы взяли, что именно это решило задачу?
Это просто костыль, чтобы избежать android.os.NetworkOnMainThreadException
Не более...
И его не должно быть в готовом приложении.
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 13:04  [ТС] #24
Armagedo, Мда Все таки CoolMind был прав на счет AsyncTask. Почитал про StrictMode и действительно костылище для отладки и только. И там все тычат на использования AsyncTask.

P.S. stackoverflow
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,733
22.01.2015, 13:12 #25
Kroshandowski, спасибо за комплимент.
В общем, я у себя обычно использую предварительную проверку на наличие доступа к Wi-Fi или сотовой сети (без проверки наличия там Интернета). Это сразу отсеивает случаи, когда устройство в оффлайн-режиме. Функция такая:
Java
1
2
3
4
5
6
7
8
9
10
11
12
    public boolean isConnected(Context context){
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (NetworkInfo networkInfo : info) {
                    if (networkInfo.isAvailable() && networkInfo.isConnected())
                        return true;
                }
        }
        return false;
    }
Дальше у меня обычно идёт скачивание данных (уже в фоновом потоке), и если в нём обнаруживается ошибка, то она выдаётся на экран.
Если брать вашу ситуацию, то можно попробовать всё равно сделать AsyncTask, но с вашей функцией, только вставить её в doInBackground (честно говоря, не пробовал, может быть, и не стоит так делать). По окончании в onPostExecute прописать скачивание в WebView.
Либо, если вы используете Thread, там можно прописать выполнение кода в UI-потоке.
1
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 13:51  [ТС] #26
CoolMind, спасибо,что поделились свои решением проверки. Просто я сейчас уже не знаю,что является наиболее верным решением моего случая и начитавшись в "Стеке","Хеше","Хабре","СтартАндройде" или здесь на форуме о подобных проблемах и путях решения, теперь у меня такая каша в голове.
А если по теме, то AsyncTask я использовал для парсинга страниц с помощью Jsoup и вроде бы пока не вылетало и все работает.
Если взять за основу стандартный шаблон AsyncTask'a:
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
private class MyTask extends AsyncTask<Void, Void, Void> {
                private ProgressDialog spinner;
 
                @Override
                protected void onPreExecute() {
                        // Вначале мы покажем пользователю ProgressDialog 
                        // чтобы он понимал что началась загрузка
                        // этот метод выполняется в UI потоке
                        spinner = new ProgressDialog(MyActivity.this);
                        spinner.setMessage("Идет загрузка...");
                        spinner.show();
                }
 
                @Override
                protected Void doInBackground(Void... text) {
                        // тут мы делаем основную работу по загрузке данных 
                        // этот метод выполяется в другом потоке
                }
 
                @Override
                protected void onPostExecute(Void result) {
                        // Загрузка закончена. Закроем ProgressDialog.
                        // этот метод выполняется в UI потоке
                    spinner.dismiss();
                }
 
        }
Где должен располагаться ваш пример выше,который должен запустить дальнейшую работу с инетом или вызвать AlertDialog?

Добавлено через 24 минуты
Как-то так наверно

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
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);      
 
        new Title().execute();
 
private class MyTask extends AsyncTask<Void, Void, Void> {
                private ProgressDialog spinner;
 
                @Override
                protected void onPreExecute() {
                        // Вначале мы покажем пользователю ProgressDialog 
                        // чтобы он понимал что началась загрузка
                        // этот метод выполняется в UI потоке
                        spinner = new ProgressDialog(Second.this);
                        spinner.setMessage("Идет загрузка...");
                        spinner.show();
                }
 
                @Override
                protected Void doInBackground(Void... text) {
                       if (isConnected(this)) {
                           webview.loadUrl("file:///android_asset/traffic/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();
                    }
               }
 
                @Override
                protected void onPostExecute(Void result) {
                        // Загрузка закончена. Закроем ProgressDialog.
                        // этот метод выполняется в UI потоке
                    spinner.dismiss();
                }
 
        }
 
public boolean isConnected(Context context){
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (NetworkInfo networkInfo : info) {
                    if (networkInfo.isAvailable() && networkInfo.isConnected())
                        return true;
                }
        }
        return false;
    }
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
22.01.2015, 14:03 #27
Где ж вы ребята были когда я тут полгода назад спрашивал про проверку связи?
А какой метод лучше, isConnected которые?
У меня используется немного измененный второй:
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
public boolean isConnected(Context context) {
    boolean status = false;
    try {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getNetworkInfo(0);
        if (netInfo != null
                && netInfo.getState() == NetworkInfo.State.CONNECTED) {
            status = true;
        } else {
            netInfo = cm.getNetworkInfo(1);
            if (netInfo != null
                    && netInfo.getState() == NetworkInfo.State.CONNECTED)
                status = true;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    if (status != true)
        Toast.makeText(context,
                R.string.toast_never_internet, Toast.LENGTH_SHORT).show();
    return status;
}
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
22.01.2015, 14:46  [ТС] #28
CoolMind, попробовал ваше решение проверки и оно РАБОТАЕТ даже без StrictMode.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
22.01.2015, 14:59 #29
Естественно, потому что оно не проверяет есть ли доступ в "СЕТЬ ИНТЕРНЕТ", а не просто в сеть (WI-FI, GSM, ...)
Оно не использует соединенеие с глобальным ресурсом в основном потоке.

Что, в принципе, - фонарный столб для проверки возможности загрузки из сети интернет и с полезностью, стремящейся к бесконечно малой величине
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
22.01.2015, 15:09 #30
Цитата Сообщение от Armagedo Посмотреть сообщение
Естественно, потому что оно не проверяет есть ли доступ в "СЕТЬ ИНТЕРНЕТ"
А также требует дополнительное разрешение и кроме того, если сеть есть, но никакая, выкинет ошибку в асинктаске при коннекте.
1
22.01.2015, 15:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2015, 15:09
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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