读取getEntity()时异步任务长时间延迟

时间:2014-10-22 13:57:32

标签: android android-asynctask

我正在从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没有获取资源而发生延迟?

1 个答案:

答案 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()