Мне нужна помощь в проверке того, подключен ли мой телефон к Интернету. Я начал с pinging IP для проверки соединения. Выглядело это так:Как правильно использовать AsyncTask на Android?
protected Boolean checkInternetConnection(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("https://www.google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
}
Однако ВСЕГДА бросил NetworkOnMainThreadException, так что я использовал AsyncTask:
private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("https://www.google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
}
Является ли этот код правильно? Потому что я не знаю, как это назвать. Я пробовал:
new CheckConnectionTask().execute();
Что-нибудь не хватает там? Потому что это не работает. Также обратите внимание, что я видел много предыдущих вопросов, но я не нашел ответа на эту проблему, поэтому я задал свой вопрос. Если вы видели ответ на вопрос, который может решить мою проблему, вы можете связать его здесь, но имейте в виду, что я не знаком с Android или Java, так что это может быть непонятно мне. Я бы предпочел правильный код в качестве ответа и короткое объяснение, почему мое не сработало. Кроме того, мне нужно знать, подключен ли телефон к ИНТЕРНЕТ, а не СЕТЬ, поэтому ConnectivityManager не будет беспокоить меня.
EDIT - благодарю вас всех за ответы. Прежде всего, у меня есть все необходимые разрешения. Кроме того, я не могу получить каких-либо результатов в настоящее время, как и Android-студия выделяет следующий код:
Boolean internetConnection;
internetConnection = new CheckConnectionTask().execute();
Как неправильно и он просто не позволит мне вызвать функцию. Что с этим не так? Не хватает ли каких-либо параметров? Потому что я определил params как Void, так что кажется нелогичным.
Edit 2 - Я использовал onPostExecute, как это было предложено @vandaics, и это выглядит, как это сейчас:
private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
internetConnection = result;
}
}
Он работает, и я называю это при вызове метода OnCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new CheckConnectionTask().execute();
}
Работает, мои приложения проверяют, подключен ли Интернет и реагирует должным образом. Если вы считаете, что что-то может не работать, или есть более простой способ сделать это, дайте мне знать. Большое спасибо вам, ребята, особенно @vandaics и @Sunil. Кроме того, мне нужно использовать суперкласс, как здесь ?:
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
internetConnection = result;
}
Что он делает и это необходимо?
Имеет ли ваше приложение разрешение на доступ в Интернет? У вас есть ' ' в вашем манифесте? –
Вы пытались выполнить сетевое подключение? –
Откуда вы знаете, что ничего не делали. там нет журналов, чтобы указать, удалось ли это или не удалось. Единственный способ узнать, если он что-то сделал, - это если он не прошел из-за исключения – ucsunil