-1

Мне нужна помощь в проверке того, подключен ли мой телефон к Интернету. Я начал с 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; 
    } 

Что он делает и это необходимо?

+0

Имеет ли ваше приложение разрешение на доступ в Интернет? У вас есть '' в вашем манифесте? –

+0

Вы пытались выполнить сетевое подключение? –

+0

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

ответ

0

, чтобы проверить, если подключение к Интернету доступен, вы можете сделать это:

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 
    //return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

Вы не можете позвонить

Boolean internetConnection; 
internetConnection = new CheckConnectionTask().execute(); 

возвращаемое значение excute() не то, что вы хотите. Если вы хотите использовать asyntask вы можете установить логическую переменную в onPostExecute(...):

private boolean isConnect = false; 
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; 
    } 
} 
@Override 
protected void onPostExecute(Boolean result) { 
    super.onPostExecute(aVoid); 
    isConnect = result; 
} 
} 

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

+0

Используется ли метод «isNetworkAvailable» для проверки сетевого подключения или подключения к Интернету? Потому что мне нужно знать, есть ли соединение INTERNET. – Piotr

+0

проверяет как сетевое подключение, так и подключение к Интернету. – Robust

0

Если вы собираетесь использовать AsyncTaks вы пропустили onPostExecute метод:

protected void onPostExecute(Boolean result) { 
    //your code here 
} 

Вы также можете добавить дополнительный onProgressUpdate метод:

protected void onProgressUpdate(Integer... progress) { 
    //do something on update 
} 

Тогда для выполнения вы делаете:

новый DownloadFilesTask(). Execute();

Вот хороший пример, который вы можете использовать: http://developer.android.com/reference/android/os/AsyncTask.html

+1

Результат в вопросе булев, не длинный. Также «ваш код здесь» немного дешев, кажется вероятным, что оригинальный плакат не будет точно знать, что делать здесь. –

+0

Спасибо @ci_ Я этого не заметил. – BlackHatSamurai

3

Вы в настоящее время не видят ничего, потому что у вас нет никаких заявлений в журнале или вы действительно не проверяя ни за что.

Вызов

новый CheckConnectionTask(). Выполнить()

работает в 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; 
     } 
    } 

    @Override 
    public void onPostexecute(Boolean result) { 
     // TO DO on the UI thread 
     Log.i("AsyncTask", "Result = " + result"); 
    } 
} 

EDIT: Вызов:

новый CheckConnectionTask() выполнить()

возвращает экземпляр AsyncTask, что он выполняется и не логическое значение (хотя. вы указываете, что Boolean должен быть выходным). Следовательно, здесь вы видите ошибку компиляции. AsyncTask был разработан как автономный - он делает все, что должен делать, а затем завершается. Если вам нужно изменить переменную экземпляра уровня класса (из класса, содержащего AsyncTask, как внутреннюю задачу), которая может быть выполнена, но не предлагается.

+0

Спасибо, но я не могу запустить свой код сейчас, потому что я хотел использовать это: Boolean internetConnection = new CheckConnectionTask(). Execute(); , Это заставило мой код не запускаться, потому что() после выполнения содержит ошибку. Здесь должен присутствовать параметр, но я определил параметры для этого метода как Void, так что может вызвать проблему? – Piotr

+0

Строка кода Boolean internetConnection = new CheckConnectionTask(). Execute(); это ошибка компиляции, и я отредактировал свой ответ, чтобы объяснить, почему. Дайте знать, если у вас появятся вопросы. – ucsunil

+0

Так что я не должен использовать AsyncTask для проверки соединения Interet? Как мне это сделать? Является ли метод «isNetworkAvailable» предложенным @vandaics правильным? – Piotr

Смежные вопросы