가능한 중복 : 오랫동안
NetworkOnMainThreadExceptionHttpResponse.getEntity() NetworkOnMainThreadException
는, 나는 AsyncTask
에서 HTTP 요청을 수행 일반적인 코드를 사용하고있다. AsyncTask
은 HttpResponse
개체를 반환합니다. 모든 것이 훌륭하게 작동하고 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;
}
나는 그 질문과 블로그 글을 읽었다. 차이점은, 저는 비동기 작업에서 네트워킹을하고 있다는 것입니다. 나는 HttpResponse를 되 찾는다. HttpResponse.getEntity()를 호출 할 때만 예외가 발생합니다. – Adam