2014-10-22 3 views
0

Я читаю данные с сервера REST. по случаю я получаю очень большие задержки, но после общения:Async task long delay on reading getEntity()

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

Насколько велика ваша сущность? Как быстро ваш сервер? – 323go

+0

Задержка не зависит от размера ответа. Поскольку я работаю с одним сервером, его отзывчивость как таковая не является проблемой. Его рабочая нагрузка в любой момент времени может быть проблемой, предполагая, что getEntity все еще является частью процесса коммуникации. Это действительно вопрос. –

+0

Да, 'getEntity()' все еще является частью процесса связи. – 323go

ответ

0

Да, response.getEntity() все еще является частью вашего ответа HTTP/связи. Он просто вернет HttpEntity, который завершает ваш ответ. EntityUtils.toString - это тот, который вызывает вашу неприемлемую задержку, поскольку он блокирует вызов до тех пор, пока он не завершит чтение всего потока ответов и не преобразуется в строку. Задержка может быть вызвана медленным сетевым подключением/пропускной способностью или медленным ответом вашего сервера. Такие сетевые задержки иногда неизбежны на мобильных устройствах, вам нужно будет показать некоторое обновление/прогресс пользовательского интерфейса.

Вместо EntityUtils.toString используйте response.getEntity().getContent(), чтобы получить лежащий в основе inputStream и вручную прочитать в цикле в то время, периодически вызывая onProgressUpdate так что ваш UI может показать какой-то прогресс. По завершении с inputStream вызовите close(), в котором указывается конец вашего запроса. См. this SO question for a code snippet of while loop, не забудьте позвонить по телефону reader.close()