我正在从REST服务器读取数据。有时我会得到很长的延迟,但是在沟通之后:
protected JSONObject doInBackground(String... params)
...
HttpResponse response;
client = new DefaultHttpClient();
...
HttpPost post = new HttpPost(sendURL);
StringEntity se = new StringEntity( postJSON.toString(), "UTF-8");
Log.d(getClass().getName(), String.format("post object: %s", postJSON.toString()));
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
Log.d(getClass().getName(), "Response received");
if(response!=null){
String responseStr = null;
if (response.getStatusLine().getStatusCode() == 200){
try {
Log.d(getClass().getName(), "Response status OK");
responseStr = EntityUtils.toString(response.getEntity());
Log.d(getClass().getName(), "Response String read: "
...
任务需要很长时间才能完成,从而产生不可接受的用户体验。日志中的时间戳表示对response.getEntity()的调用需要很长时间,30秒甚至更长时间。诸如this之类的问题表明对getEntity()的调用确实涉及网络通信。是这样的吗?或者是因为AsyncTask没有获取资源而发生延迟?
答案 0 :(得分:0)
是的,response.getEntity()
仍然是您的HTTP响应/通信的一部分。它只会返回一个HttpEntity
,它会回复您的回复。 EntityUtils.toString
是造成您不可接受的延迟的因素,因为它会阻止调用,直到完成读取整个响应流并转换为字符串。延迟可能是由于网络连接/带宽缓慢或服务器响应缓慢造成的。在移动设备上,这些网络延迟有时是不可避免的,您需要显示一些UI更新/进度。
使用response.getEntity().getContent()
代替EntityUtils.toString来获取基础inputStream
并在while循环中手动读取它,定期调用onProgressUpdate
,以便您的UI可以显示某种进度。完成inputStream
调用close()
后,将表明您的请求通信已结束。请参阅this SO question for a code snippet of while loop,不要忘记致电reader.close()