2012-11-20 3 views
3

가능한 중복 : 오랫동안
NetworkOnMainThreadExceptionHttpResponse.getEntity() NetworkOnMainThreadException

는, 나는 AsyncTask에서 HTTP 요청을 수행 일반적인 코드를 사용하고있다. AsyncTaskHttpResponse 개체를 반환합니다. 모든 것이 훌륭하게 작동하고 GUI 스레드는 절대로 얼어 붙지 않았습니다.

serverResponse.getEntity().getContent(); 

도대체 ?? :

이제, 갑자기, 이것은 NetworkOnMainThreadException를 생성 getEntity()이 네트워킹으로 간주되는 이유는 무엇입니까 ?? 내 마음 속에서, 그 라인은 단순히 응답을 입력 스트림으로 변환하고 네트워크 연결이 필요하지 않아야합니다. 누가이 결정을 내렸습니까? 왜 이들은 네트워킹이되어야한다고 결정 했습니까?

비동기 작업 :

public class AsyncHttpTask extends AsyncTask<HttpRequestInfo, Integer, HttpRequestInfo> { 

public AsyncHttpTask() { 
    super(); 
} 

protected HttpRequestInfo doInBackground(HttpRequestInfo... params) { 
    HttpRequestInfo rinfo = params[0]; 
    try{ 
     HttpClient client = new DefaultHttpClient(); 
     HttpResponse resp = client.execute(rinfo.getRequest()); 
     rinfo.setResponse(resp); 
    } 
    catch (Exception e) { 
     rinfo.setException(e); 
    } 
    return rinfo; 
} 

@Override 
protected void onPostExecute(HttpRequestInfo rinfo) { 
    super.onPostExecute(rinfo); 
    rinfo.requestFinished(); 
} 

콜백 인터페이스 :

public interface HttpCallback { 

     public void onResponse(HttpResponse serverResponse); 
     public void onError(Exception e); 

    } 

HttpRequestInfo :

public class HttpRequestInfo { 

    private HttpUriRequest request_; 
    private HttpCallback callback_; 
    private Exception exception_; 
    private HttpResponse response_; 

    public HttpRequestInfo(HttpUriRequest request, HttpCallback callback) { 
     super(); 
     request_ = request; 
     callback_ = callback; 
    } 

    public HttpUriRequest getRequest() { 
     return request_; 
    } 

    public void setRequest(HttpUriRequest request) { 
     request_ = request; 
    } 

    public HttpCallback getCallback() { 
     return callback_; 
    } 

    public void setCallback(HttpCallback callback) { 
     callback_ = callback; 
    } 

    public Exception getException() { 
     return exception_; 
    } 

    public void setException(Exception exception) { 
     exception_ = exception; 
    } 

    public HttpResponse getResponse() { 
     return response_; 
    } 

    public void setResponse(HttpResponse response) { 
     response_ = response; 
    } 

    public void requestFinished(){ 
     if(exception_ != null){ 
      callback_.onError(exception_); 
     } 
     else { 
      callback_.onResponse(response_); 
     } 
    } 
} 

는 그럼 난 개체에 JSON 응답을 변환 잭슨을 사용합니다. 이것은 예외가 발생하는 곳입니다.

@Override 
public <T> T handleResponse(HttpResponse serverResponse, Class<T> typeOfResponse) { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    T responseObject = null; 
    try { 
     responseObject = mapper.readValue(serverResponse.getEntity().getContent(),typeOfResponse); //THIS LINE IS EVIL 
    } catch (JsonParseException e) { 
     throw new ARException("Couldn't handle the response because the http response contained malformed json.",e); 
    } catch (JsonMappingException e) { 
     throw new ARException("Mapping the json response to the response object " + typeOfResponse + " failed.",e); 
    } catch (IllegalStateException e) { 
     throw new ARException("Couldn't convert the http response to an inputstream because of illegal state.",e); 
    } catch (IOException e) { 
     throw new ARException("Couldn't convert the http response to an inputstream.",e); 
    } 
    return responseObject; 
} 
+0

나는 그 질문과 블로그 글을 읽었다. 차이점은, 저는 비동기 작업에서 네트워킹을하고 있다는 것입니다. 나는 HttpResponse를 되 찾는다. HttpResponse.getEntity()를 호출 할 때만 예외가 발생합니다. – Adam

답변

2

네트워크가 아닌 별도의 스레드로 작업해야하기 때문에 메인이 아닙니다. AsyncTask 또는 Thread + Handler을 사용할 수 있습니다. AsyncTask를 사용하는 경우 모두 네트워크와 작동하므로 doInBackground 부분에서 수행해야합니다.

+1

httpResponse.getEntity(). getContent()가 네트워킹으로 간주됩니까? 왜? – Adam

+0

나는 모든 코드를 올렸다. 비동기 작업에서 모든 네트워킹을하고 있지 않습니까? – Adam

+0

httpResponse.getEntity(). getContent()는 HttpResponse에서 데이터를 가져 오기 때문에 네트워크와 작동합니다. 어디에서 handleResponse를 실행합니까? –

관련 문제