gpt4 book ai didi

android - HttpResponse.getEntity() NetworkOnMainThreadException 异常

转载 作者:太空狗 更新时间:2023-10-29 13:33:05 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
NetworkOnMainThreadException

很长一段时间以来,我一直在使用在 AsyncTask 中执行 http 请求的通用代码。 AsyncTask 返回一个 HttpResponse 对象。一切都很好,GUI 线程从未卡住或发生任何事情。

现在,突然间,这会创建一个 NetworkOnMainThreadException:

serverResponse.getEntity().getContent();

什么鬼??为什么 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();
}

回调接口(interface):

    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_);
}
}
}

然后我使用 jackson 将 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;
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com