2013-08-25 2 views
0

Я пытаюсь проверить подключение к Интернету на Android (фактическое соединение, в отличие от сетевого доступа), которое вызывает NetworkOnMainThreadException. Из-за этого я пытаюсь переместить его в AsyncTask.AsyncTask возвращает логическое значение? Лучший способ реализовать?

Это мой isConnected() метод:

if(!checkNetwork(parent)){ 
    return false; 
} 
if(!checkConnection(url)){ 
    return false; 
} 
return true; 

Теперь я проверить соединение, используя только if(isConnected()), но я получаю исключение. Итак, что мне нужно сделать, это переместить вышеуказанный метод в AsyncTask и получить возвращаемое значение.

Я подумал, что, возможно, я мог бы сделать глобальную переменную, которая будет отслеживать ее, но тогда я не уверен, будет ли мое значение возвращено до или после того, как AsyncTask установил его.

Я уверен, что есть способы сделать это, поэтому я ищу идеи о том, как это сделать. Любые советы приветствуются!

EDIT: Я обновил свой код, чтобы использовать AsyncTask, дайте мне знать, если это выглядит лучше:

ConnectUtils.java:

public class ConnectUtils { 

    private static boolean hasConnected, hasChecked; 

    public boolean isConnected(Context parent, String url){ 
     hasChecked = false; 
     this.new CheckURL(parent, url).execute(); 
     while(!hasChecked){ } 
     return hasConnected; 
    } 

    private class CheckURL extends AsyncTask<Void, Void, Boolean>{ 

     private Context parent; 
     private String url; 

     public CheckURL(Context parent, String url){ 
      this.parent = parent; 
      this.url = url; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params){ 
      if(!checkNetwork(parent)){ 
       return false; 
      } 
      if(!checkConnection(url)){ 
       return false; 
      } 
      return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean result){ 
      super.onPostExecute(result); 
      hasConnected = result; 
      hasChecked = true; 
     } 
    } 

    private static boolean checkNetwork(Context parent){ 
     ConnectivityManager conMgr = (ConnectivityManager)parent.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(conMgr.getActiveNetworkInfo() != null){ 
      NetworkInfo activeInfo = conMgr.getActiveNetworkInfo(); 
      if(!activeInfo.isConnected() || !activeInfo.isAvailable()){ 
       return false; 
      } 
      return true; 
     } 
     return false; 
    } 

    private static boolean checkConnection(String url){ 
     boolean responded = false; 
     HttpGet requestTest = new HttpGet(url); 
     HttpParams params = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(params, 3000); 
     HttpConnectionParams.setSoTimeout(params, 5000); 
     DefaultHttpClient client = new DefaultHttpClient(params); 
     try { 
      client.execute(requestTest); 
      responded = true; 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return responded; 
    } 
} 

вызывается через if(!new ConnectUtils().isConnected(this, "http://google.com"))

ответ

8

Вот пример кода:

new AsyncTask<Void, Void, Boolean>() 
{ 
    @Override 
    protected Boolean doInBackground(Void... p) 
    { 
     return isConnected(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) 
    { 
     //this is code for the UI thread, now that it knows what is the result. 
    } 
}.execute(); 
+1

Fixed отступа для вас. –

+1

вы не зафиксировали никаких отступов. это было хорошо. это называется «стиль кода whitesmiths». прочитайте об этом: http://en.wikipedia.org/wiki/Indent_style#Whitesmiths_style. Я вернул код в то, что было. я работал со многими компаниями, каждый из которых имеет свои собственные правила отступов. нет «правильного» способа, поэтому исправлять нечего. поскольку это один из основных способов отступов, если вы разработчик, вы должны быть в состоянии легко прочитать его. –

+0

@androiddeveloper Итак, я могу сделать что-то вроде 'boolean b = new AsyncTask(). Execute();'? (Я знаю, что это неправильно, но вы должны понять, что я имею в виду) – whitfin

1

В ваш метод AsyncTaskonPostExecute, вызовите функцию в вашей деятельности для обработки (теперь известного) состояния соединения. Пока этот метод не выполняется, ваш пользовательский интерфейс и/или внутренняя логика должны отражать, что состояние соединения неизвестно.

0

Проверьте подключение в методе doInBackground() от AsyncTask<Url, Void, Boolean> Params = url, progress = void (ничего) и результат является логическим.

onPostExecute() вернется в основной поток вашего приложения