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
и вы получите обратный вызов, когда сеть идет вниз или поднимается.
поэтому вы можете показать свой диалог в этом сценарии.
вы можете также запросить библиотеку для текущего состояния и выбрать не Сети задание
создать 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
}