AsyncTask Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса.
[Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })]
public abstract class AsyncTask : Java.Lang.Object
[<Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })>]
type AsyncTask = class
inherit Object
- Наследование
- Производный
- Атрибуты
Комментарии
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. Однако наиболее распространенным вариантом использования была интеграция с пользовательским интерфейсом, что приводило к утечкам контекста, пропущенным обратным вызовам или сбоям при изменениях конфигурации. Он также имеет несогласованное поведение в разных версиях платформы, поглощает исключения из doInBackground
, и не предоставляет большой полезности при использовании Executor
s напрямую.
AsyncTask является вспомогательным классом и Thread
Handler
не является универсальной платформой потоков. AsyncTasks в идеале следует использовать для коротких операций (не более нескольких секунд). Если необходимо поддерживать потоки в течение длительного времени, настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent
, такие как Executor
, ThreadPoolExecutor
и FutureTask
.
Асинхронная задача определяется вычислением, которое выполняется в фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется 3 универсальными типами, называемыми Params
, Progress
и , и Result
4 шагами с именем onPreExecute
, doInBackground
onProgressUpdate
и onPostExecute
.
<div class="special reference"><h3>Developer Guides</h3>
Дополнительные сведения об использовании задач и потоков см. в руководстве разработчика по процессам и потокам .
</Div>
<Использование< h2>/h2>
Для использования AsyncTask должен быть подклассом. Подкласс переопределяет по крайней мере один метод (#doInBackground
) и чаще всего переопределяет второй (#onPostExecute
.)
Ниже приведен пример подклассов:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
После создания задача выполняется очень просто:
new DownloadFilesTask().execute(url1, url2, url3);
<h2>универсальные типы< AsyncTask/h2>
Ниже перечислены три типа, используемых асинхронной задачей.
<ol><li>Params
— тип параметров, отправляемых задаче при выполнении.</li><li li>Progress
— тип единиц выполнения, опубликованных во время фонового вычисления.</li><li li>Result
— тип результата фонового вычисления.</li></ol>
Не все типы всегда используются асинхронной задачей. Чтобы пометить тип как неиспользуемый, просто используйте тип Void
:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
<h2>4 шага</ч2>
При выполнении асинхронной задачи задача проходит 4 шага:
<ol><li>#onPreExecute()
, вызывается в потоке пользовательского интерфейса перед выполнением задачи. Этот шаг обычно используется для настройки задачи, например для отображения индикатора выполнения в пользовательском интерфейсе.</li><li,>#doInBackground
вызывается в фоновом потоке сразу после #onPreExecute()
завершения выполнения. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. На этом шаге передаются параметры асинхронной задачи. Результат вычисления должен быть возвращен на этом шаге и будет передан обратно к последнему шагу. Этот шаг также можно использовать для #publishProgress
публикации одной или нескольких единиц хода выполнения. Эти значения публикуются в потоке пользовательского интерфейса на шаге #onProgressUpdate
.</li><li,>#onProgressUpdate
вызывается в потоке пользовательского интерфейса после вызова #publishProgress
. Время выполнения не определено. Этот метод используется для отображения любого вида хода выполнения в пользовательском интерфейсе во время фонового вычисления. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.</li><li li>#onPostExecute
, вызывается в потоке пользовательского интерфейса после завершения фонового вычисления. Результат фонового вычисления передается на этот шаг в качестве параметра.</li></ol>
<h2>Отмена задачи</ч2>
Задачу можно отменить в любой момент, вызвав #cancel(boolean)
. Вызов этого метода приведет к тому, что последующие вызовы будут #isCancelled()
возвращать значение true. После вызова этого метода #onCancelled(Object)
, вместо #onPostExecute(Object)
будет вызываться после #doInBackground(Object[])
возврата . Чтобы задача была отменена как можно быстрее, всегда следует проверка возвращаемое значение периодически из #doInBackground(Object[])
, если это возможно (внутри цикла для экземпляра#isCancelled()
).
<h2>Правила< потоков/h2>
Существует несколько правил потоков, которые должны соблюдаться для правильной работы этого класса:
<ul><li>Класс AsyncTask должен быть загружен в поток пользовательского интерфейса. Это выполняется автоматически после android.os.Build.VERSION_CODES#JELLY_BEAN
.</li><li li>. Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.<Параметр /li><li>#execute
должен вызываться в потоке пользовательского интерфейса.</li><li>не вызывайте #onPreExecute()
, #onPostExecute
, #doInBackground
, , #onProgressUpdate
вручную.</li><li li>. Задача может быть выполнена только один раз (исключение будет создано при попытке второго выполнения).</li></ul>
<h2>Наблюдаемость< памяти/ч2>
AsyncTask гарантирует синхронизацию всех обратных вызовов, чтобы обеспечить следующее без явной синхронизации.
<ul>li Эффекты #onPreExecute
памяти , и все остальные действия, выполненные до вызова #execute
, включая конструкцию объекта AsyncTask, видны для #doInBackground
.>< <Li>Эффекты #doInBackground
памяти видимы для #onPostExecute
. <Li>Все эффекты #doInBackground
памяти, которые были видны соответствующему #publishProgress
#onProgressUpdate
вызову. (Но #doInBackground
продолжает выполняться, и необходимо соблюдать осторожность, чтобы последующие обновления в #doInBackground
не влияли на выполняемый #onProgressUpdate
вызов.) <Li>Любые эффекты памяти, предшествующие вызову , #cancel
видны после вызова , #isCancelled
возвращающего значение true в результате, или во время и после результирующего вызова #onCancelled
. </ul>
<h2>Порядок выполнения</h2>
При первом появлении AsyncTasks выполнялись последовательно в одном фоновом потоке. Начиная с android.os.Build.VERSION_CODES#DONUT
, эта функция была изменена на пул потоков, позволяющий параллельно работать с несколькими задачами. Начиная с android.os.Build.VERSION_CODES#HONEYCOMB
, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложения, вызванных параллельным выполнением.
Если вы действительно хотите параллельное выполнение, можно вызвать с #THREAD_POOL_EXECUTOR
помощью #executeOnExecutor(java.util.concurrent.Executor, Object[])
.
Этот элемент устарел. Вместо этого используйте стандартные java.util.concurrent
программы параллелизма или Kotlin .
Документация по Java для android.os.AsyncTask
.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.
Конструкторы
AsyncTask() |
Создает новую асинхронную задачу. |
AsyncTask(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
Class |
Возвращает класс среды выполнения данного объекта |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
IsCancelled |
Возвращает значение |
JniIdentityHashCode |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
JniPeerMembers |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. |
PeerReference |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
SerialExecutor |
Объект |
ThreadPoolExecutor |
Объект , |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
Cancel(Boolean) |
Пытается отменить выполнение этой задачи. |
Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
Dispose() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
Dispose(Boolean) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
DoInBackground(Object[]) |
Переопределите этот метод для выполнения вычислений в фоновом потоке. |
Equals(Object) |
Указывает, равен ли какой-то другой объект этому объекту. (Унаследовано от Object) |
Execute(IRunnable) |
Удобная версия для |
Execute(Object[]) |
Выполняет задачу с указанными параметрами. |
ExecuteOnExecutor(IExecutor, Object[]) |
Выполняет задачу с указанными параметрами. |
Get() |
При необходимости ожидает завершения вычисления, а затем извлекает его результат. |
Get(Int64, TimeUnit) |
При необходимости ожидает не более заданного времени для завершения вычислений, а затем извлекает его результат. |
GetAsync() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. |
GetAsync(Int64, TimeUnit) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. |
GetHashCode() |
Возвращает значение хэш-кода для объекта. (Унаследовано от Object) |
GetStatus() |
Возвращает текущее состояние этой задачи. |
JavaFinalize() |
Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект . (Унаследовано от Object) |
Notify() |
Пробуждает один поток, ожидающий монитора этого объекта. (Унаследовано от Object) |
NotifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. (Унаследовано от Object) |
OnCancelled() |
Приложения должны предпочтительно переопределять |
OnCancelled(Object) |
Выполняется в потоке пользовательского интерфейса после |
OnPostExecute(Object) |
Выполняется в потоке пользовательского интерфейса после |
OnPreExecute() |
Выполняется в потоке пользовательского интерфейса до |
OnProgressUpdate(Object[]) |
Выполняется в потоке пользовательского интерфейса после |
PublishProgress(Object[]) |
Этот метод можно вызвать из |
SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
ToArray<T>() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
UnregisterFromRuntime() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
Wait() |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, из-за <уведомления><<> или>прерывания или прерывания.>< (Унаследовано от Object) |
Wait(Int64) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
IJavaPeerable.Disposed() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.DisposeUnlessReferenced() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.Finalized() |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.JniManagedPeerState |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. (Унаследовано от Object) |
Методы расширения
JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверенного средой выполнения Android. |
JavaCast<TResult>(IJavaObject) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. |
GetJniTypeName(IJavaPeerable) |
AsyncTask предназначен для обеспечения правильного и простого использования потока пользовательского интерфейса. |