что происходит с активным HTTP-вызовом, если активность, в которой он выполняется, закрыта? - PullRequest
1 голос
/ 22 января 2012

Я использую Apache Commons для выполнения своих HTTP-вызовов, и в моей деятельности у меня есть поток, который выполняет вызов. Если устройство выполняет вызов и сидит там, ожидая соединения (представьте, что сеть перегружена и вызов занимает некоторое время), и в то же время пользователь выходит из приложения, и действие становится фоновым. Что происходит с моим звонком? В этом отношении (если подумать), что происходит с любым потоком, который был запущен в рамках действия? Если у меня есть поток, который сидит там и делает свое дело (чем бы он ни был), и действие закрыто, должен ли я сам обрабатывать удаление потока onPause ()?

Редактировать ... Итак, учитывая ответ Теда Хоппа, как правильно убить запрос Apache? Я просматриваю документацию Commons , и есть куча методов, которые * выглядят так, как будто бы они добились цели, но поскольку в документе так мало деталей (зачем даже докупать документ, если вы ' я не собираюсь указывать что-то ?!) Мне интересно, какой из этих методов мне следует вызывать для моего объекта HttpConnection, прежде чем уничтожать поток, в котором находится мое соединение?

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Закрытие действия не оказывает прямого влияния на процесс, в котором размещается действие. Все остальные потоки продолжают работать. Вам следует переопределить один или несколько методов жизненный цикл (onPause, onDestroy и т. Д.), Чтобы обнаружить, что действие завершается, и прерывать или иным образом завершать запущенные потоки. Метод действия isFinishing() полезен для различения активности, которая закрывается, и операции, которая уничтожается и перезапускается из-за изменения конфигурации.

Ваш поток должен быть написан с методом, чтобы отменить выполнение. В частности, для apache-commons этот метод должен состоять из двух шагов. Во-первых, вы должны вызвать abort() для метода, который вы передали в ваш метод HttpClient.execute(). Во-вторых, вы должны закрыть само соединение:

client.getHttpConnectionManager()
    .getConnection(client.getHostConfiguration()).close();

На самом деле, если вы делаете только последний шаг, этого на самом деле должно быть достаточно, чтобы добавить IOException в метод и остановить все.

0 голосов
/ 22 января 2012

Google настоятельно рекомендует разработчикам не совершать HTTP-вызовы в Activity. Service - рекомендуемая модель. Приложения для Android будут приостановлены по многим, многим причинам. Некоторые из наиболее распространенных являются ответить на звонок, смс или электронную почту. Я сомневаюсь, что вы хотите отменить звонок, и поэтому пользователь должен ждать его снова, когда он / она вернется, когда все это может произойти в фоновом режиме.

Наилучшим вариантом является использование Service или IntentService для выполнения вызова и сохранения данных (возможно, в базу данных SQLite). Когда Activity возобновляется, он может просто проверить наличие новых записей в базе данных.

Если вы еще не видели его, ознакомьтесь с « Разработка клиентских REST-приложений для Android » от Google I / O 2010. Обязательно обратите внимание на ссылку для скачивания PDF.

...