2014-01-02 5 views
0

Моя проблема - больше информации, чем реальной проблемы.Активность закрыта до получения ответа сервера

Предположим, у меня есть активность A, которая отправляет запрос на сервер во время onCreate. Сама операция выполняет обратный вызов для получения ответа. Таким образом, процедура является асинхронной.

Теперь предположим, что пользователь начинает эту операцию, но до получения ответа пользователь закрывает действие.

Итак, когда приложение получает ответ ... Что случилось? Приложение все еще работает? Или он выкинет исключение нулевого указателя, потому что активность (и, следовательно, обратный вызов) больше не существует?

Для последнего случая, который может быть хорошим решением? Запустить сервис для запроса? Или что-то другое?

Заранее спасибо.

+0

Пожалуйста, отредактируйте ваш вопрос и добавьте код, в котором выполняется ваш асинхронный процесс. – petey

+0

Ничего не случится. Поскольку обратный вызов больше не существует, ответ будет просто проигнорирован. Если это не то, что вы хотите, то услуга, вероятно, путь. – Simon

ответ

0

Ваше поведение очень не так. Никогда не используйте действия по созданию метода для любых сетевых вызовов. Метод onCreate предназначен для настройки элемента ui для пользовательского интерфейса, все сетевые вызовы должны выполняться при возобновлении.

Если вы запустили сетевой вызов в onresume, и пользователь не дождался его результата и прекратил действие, ничего не произойдет, так как u вызван в onResume. Вы должны обработать эту задачу, отменив эту задачу.

0

Если вы используете AsyncTask, существует доступный вам метод cancel(). Используя пример DownloadFilesTask на этой странице: http://developer.android.com/reference/android/os/AsyncTask.html

В вашей деятельности, добавьте поле под названием myTask как экземпляр DownloadFilesTask и установить его на OnCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.myTask = new DownloadFilesTask().execute(url1, url2, url3); 
} 

Тогда в OnPause вы cancel документы:

@Override 
protected void onPause() { 
    if (this.myTask != null){ 
     this.myTask.cancel(true); 
     this.myTask = null; 
    } 
    super.onPause(); 
} 

Если вы не используете AsyncTask, мои извинения не были известны на момент написания этого письма, подумайте над его использованием.

Смежные вопросы