2013-08-25 2 views
0

NetworkOnMainThreadException이 발생하는 Android (실제 네트워크 연결과 반대되는 연결)에서 인터넷 연결을 확인하려고합니다. 이 때문에 나는 그것을 AsyncTask으로 옮기려고합니다.부울을 반환하는 AsyncTask? 구현하는 가장 좋은 방법은?

이 내 isConnected() 방법 :

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

지금, 난 그냥 if(isConnected())을 사용하지만 난 예외를 받고 있어요하여 연결을 확인합니다. 그래서 내가해야 할 일은 위의 메소드를 AsyncTask로 옮기고 반환하는 값을 가져 오는 것입니다.

전 추적 할 수있는 전역 변수를 만들 수 있다고 생각했지만 AsyncTask가 설정 한 전후에 내 값이 반환되는지 확실하지 않습니다.

이렇게 할 수있는 방법이 있으므로 확신 할 수있는 아이디어가 필요합니다. 어떤 조언을 부탁드립니다!

편집 : 나는 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

당신을위한 들여 쓰기를 수정했습니다. –

+1

들여 쓰기를 "고정"하지 않았습니다. 전에는 괜찮 았어. 그것은 "whitesmiths 코드 스타일"이라고 불립니다. 그것에 대해 읽어보십시오 : http://en.wikipedia.org/wiki/Indent_style#Whitesmiths_style. 코드를 원래대로 되돌려 놓았습니다. 나는 많은 회사와 일해 왔고, 각각은 독자적인 들여 쓰기 규칙을 가지고 있습니다. "올바른"방법이 없기 때문에 수정할 것이 없습니다. 들여 쓰기를하는 기본적인 방법 중 하나이기 때문에 개발자라면 쉽게 읽을 수 있어야합니다. –

+0

@androiddeveloper 그래서'boolean b = new AsyncTask(). execute();'와 같은 것을 할 수 있습니다. (내가 틀렸다는 것을 알지만, 의미를 알아야한다.) – whitfin

1

통해 호출 AsyncTaskonPostExecute 메소드에서 활동의 함수를 호출하여 (현재 알려진) 연결 상태를 처리하십시오. 해당 메서드가 실행될 때까지 UI 및/또는 내부 논리는 연결 상태를 알 수 없으므로 반영해야합니다.

0

doInBackground() 방법의 연결을 확인하십시오. AsyncTask<Url, Void, Boolean> Params = url, progress = void (nothing)이며 결과는 부울입니다.

onPostExecute()

관련 문제