У меня есть AsyncTask
класс, который я выполняю, который загружает большой список данных с веб-сайта.
В случае, если у конечного пользователя очень медленное или нестабильное соединение для передачи данных во время использования, я хотел бы сделать AsyncTask
тайм-аут по истечении определенного периода времени. Мой первый подход к этому такой:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
После запуска AsyncTask
запускается новый обработчик, который отменит AsyncTask
через 30 секунд, если он все еще работает.
Это хороший подход? Или есть что-то встроенное, AsyncTask
что лучше подходит для этой цели?
java
android
android-asynctask
Джейк Уилсон
источник
источник
Ответы:
Да, есть AsyncTask.get ()
Обратите внимание, что, вызывая это в основном потоке (AKA. UI thread), вы блокируете выполнение. Возможно, вам потребуется вызвать его в отдельном потоке.
источник
handler
подход, который я описываю в моем вопросе? Кажется намного более простым, потому что поток пользовательского интерфейса не зависает в ожидании запуска Runnable обработчика ...В случае, если ваш загрузчик основан на URL-соединении, у вас есть ряд параметров, которые могут помочь вам определить тайм-аут без сложного кода:
Если вы просто добавите этот код в свою асинхронную задачу, все в порядке.
«Тайм-аут чтения» предназначен для проверки неисправности сети на всем протяжении передачи.
«Тайм-аут соединения» вызывается только в начале, чтобы проверить, работает ли сервер или нет.
источник
Используйте класс CountDownTimer в дополнение к расширенному классу для AsyncTask в методе onPreExecute ():
Основное преимущество, Async-мониторинг выполняется внутри класса.
измените CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000), например, и он вызовет onTick () 6 раз перед вызовом onFinish (). Это хорошо, если вы хотите добавить мониторинг.
Спасибо за все хорошие советы, которые я получил на этой странице :-)
источник
Я не думаю, что в AsyncTask есть что-то подобное. Ваш подход кажется хорошим. Просто не забудьте периодически проверять значение isCancelled () в методе doInBackground вашего AsyncTask, чтобы завершить этот метод, как только поток пользовательского интерфейса отменит его.
Если вы по какой-то причине хотите избежать использования обработчика, вы можете периодически проверять System.currentTimeMillis в своей AsyncTask и выходить по таймауту, хотя мне больше нравится ваше решение, поскольку оно может фактически прервать поток.
источник
источник
Вы можете поставить еще одно условие, чтобы сделать отмену более надежной. например,
источник
Вдохновленный вопросом, я написал метод, который выполняет некоторую фоновую задачу через AsyncTask, и если обработка занимает больше, чем LOADING_TIMEOUT, появится диалоговое окно с предупреждением для повторной попытки.
источник