2013-07-10 5 views
1

Я пытаюсь обработать ситуацию, когда пользователь теряет свое соединение с данными во время запроса Http в AsyncTask. В настоящее время AsyncTask никогда не закончит выполнение, если это произойдет, и приложение просто заглохнет. Я даже не могу проверить isCancelled(), потому что запрос Http просто бросается в очередь на один вызов функции, поэтому я не могу реализовать цикл или что-то еще.Отмена сетевого вызова в AsyncTask

Я использую следующие в потоке пользовательского интерфейса, но я не могу понять, как проверить, если задача была отменена внутри задачи:

task = new LoginTask(); 
    task.execute(this, mUsername, mPassword); 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) 
      { 
       task.cancel(true); 
      } 
     } 
    }, 5000); 
+0

ping местоположение, прежде чем пытаться открыть его с помощью задачи async? посмотрите, есть ли у вас какие-либо другие доступные интерфейсы, кроме 127.0.0.1? – Shark

+1

Не знаете, как вы получаете свои данные, но большая часть поддержки сетевых/http-вызовов устанавливает тайм-аут. Например, HttpConnectionParams. –

+0

@Shark Я проверяю активное соединение перед выполнением вызова, но вызов занимает около 5 секунд, и пользователь может потерять соединение за это время. – ashishduh

ответ

0

Поскольку KSoap 2 написан на Java, вам может быть предложено абстрагироваться от одного из классов и вручную установить тайм-аут на HttpConnection.

Основываясь на нашем предыдущем обсуждении, вам, вероятно, придется переопределить метод, который не устанавливает тайм-аут в соединении и заменяет его собственным методом и временем, связанным с отключением. Должна быть управляемой благодаря KSoap, являющейся open source! Удачи.

+0

хороший пост о том, как отменить асинтаску http://www.quicktips.in/correct-way-to-cancel-an-asynctask-in-android/ –

0

Для того, чтобы остановить обработку, вы необходимо выполнить проверку isCancelled() внутри doInBackground(). Если в вашем doInBackground есть какие-то разумные места, вы можете добавить if-statement. В противном случае вам следует рассмотреть возможность установки тайм-аута на http-соединение.

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