0

내 안드로이드 애플 리케이션에서 일부 HTTP 요청을해야합니다. 필요에 따라 네트워크 부분이 doInBackground에있는 AsyncTask를 사용합니다.NetworkOnMainThreadException with AsyncTask

public class AsyncRequest extends AsyncTask<Void, Integer, HttpResponse>{ 

private  ProgressDialog dialog; 
private  Activity  activity; 
private  HttpUriRequest query; 
private  HttpClient  client; 
private  HttpResponse response; 
private  String   dialogMsg; 
private  String   uri; 

public String getUri() { 
    return uri; 
} 

public void setUri(String uri) { 
    this.uri = uri; 
} 

public AsyncRequest(Activity a, HttpUriRequest q, HttpClient c, String m) { 
    query = q; 
    client = c; 
    activity = a; 
    dialog = new ProgressDialog(a); 
    dialogMsg = m; 
} 

@Override 
protected void onPostExecute(HttpResponse res) { 
    if (dialog.isShowing()) 
     dialog.dismiss(); 
} 

protected void onPreExecute() { 
    this.dialog.setMessage(dialogMsg); 
    this.dialog.show(); 
} 

@Override 
protected HttpResponse doInBackground(Void... arg0) { 
    try { 
     response = client.execute(query); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
    return response; 
} 

protected HttpResponse getResponse() { 
    return response; 
} 
}  

이 그리고, 내 UI 스레드에서, 나는 그것을 이런 식으로 사용합니다 : 여기

는 내 요청 클래스입니다

AsyncRequest  request; 
    HttpClient   httpClient = new DefaultHttpClient(); 
    HttpGet    getQuery = new   HttpGet("Here goes my url"); 
    HttpResponse  response = null; 
    String    rt = "Null"; 
    getQuery.setHeader("Authorization", getIntent().getExtras().getString("token")); 

    request = new AsyncRequest(this, getQuery, httpClient, "Loading events..."); 
    try { 
     response = request.execute().get(3, TimeUnit.SECONDS); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    HttpEntity entity = response.getEntity(); 
    try { 
     rt = EntityUtils.toString(entity); 
    } catch (Exception e) { 
      e.printStackTrace(); 
     return ; 
    } 

그래서, 난 안드로이드 초보자,하지만 난이 추측 네트워크 관련 코드가 주 스레드에서 실행될 때 예외가 발생합니다. 하지만 내 doInBackground() 메서드에서 client.execute() 실행됩니다. 문제를 일으키는 execute(). get() (ui 스레드에서) 호출입니까?

+0

다시 포맷 코드에 blackbelt하여 답을 확인하고는 일이었다 그래서 로그 캣 –

답변

2

는이

response = request.execute().get(3, TimeUnit.SECONDS); 

get()AsyncTask 더 이상 비동기하게 호출합니다. 그것은 응답을 기다리는 UI 스레드를 차단합니다. 이로 인해 NetworkOnMainThreadException이됩니다.

그냥 request.execute()를 사용 get(3, TimeUnit.SECONDS);

제거하십시오. ui는 onPostExecute으로 업데이트 할 수 있습니다. 인터페이스를 Activity에 대한 콜백으로 사용할 수도 있습니다.

는 아래의 링크를

How do I return a boolean from AsyncTask?

+0

을 게시 할 수 있습니다. 감사 ! –

+0

당신은 환영합니다 – Raghunandan