2014-01-09 4 views
0

Мое приложение содержит функцию, требующую времени для загрузки (разбора файлов). Эта функция вызывается в многопользовательском случае, то есть из нескольких состояний, запускаемых пользователем. Кроме того, он вызывается, когда вызывается onCreate.Использование задачи async для android в зависимости от последовательности задач

В простом слове, поток:

  1. пользователь нажмите/OnCreate вызвать
  2. Функции для разбора файла
  3. Опубликовать в окна
  4. Других постобработки

Я надеюсь, пользователь может нажать «Отмена», чтобы остановить разбор файлов.

Я попытался использовать asynctask. Я знаю, что могу включить функцию onPostExecute. Но я предполагаю, что onPostExecute предназначен только для диалога прогресса. Или мне нужно переместить много кодов (для разных случаев). Не хорошая идея.

Я не предполагаю, что пользователь должен что-либо делать во время разбора файлов.

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

Проще говоря, я хочу дождаться «разбора файлов», но я не хочу занимать поток пользовательского интерфейса, поэтому пользователь может нажать «Отменить».

обновление: Я пробовал. однако есть проблема: Я использую asynctask. Я позвонил:

mTask = new YourAsyncTask().execute(); 
YourAsyncTask.get(); // this force to wait for YourAsyncTask to return. 
DoSomethingBaseOnAsyncTaskResult(); 

YourAsyncTask.get() удерживает поток пользовательского интерфейса. Таким образом, диалог загрузки отсутствует, и пользователь не может нажать «Отменить» в диалоговом окне. Кажется, я должен двигаться каждую строку после

mTask = new YourAsyncTask().execute(); 

в

OnPostExecute() 

, которые я не предпочитаю, чтобы сделать это, потому что DoSomethingBaseOnAsyncTaskResult() может сильно отличаться в зависимости от результата возврата. или иначе, это становится делать все YourAsyncTask()

ответ

0

AsyncTasks в идеале должны быть использованы для коротких операций (несколько секунд, в лучшем случае.) Когда асинхронная задача выполняется, задача проходит 4 этапа:

onPreExecute (), вызываемый в потоке пользовательского интерфейса перед выполнением задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

doInBackground (Params ...), вызывается на фоне нити сразу после onPreExecute() завершает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Этот шаг также может использовать publishProgress (Progress ...) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на этапе onProgressUpdate (Progress ...).

onProgressUpdate (Progress ...), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока фоновое вычисление все еще выполняется. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

onPostExecute (Результат), вызывается в потоке пользовательского интерфейса после завершения вычисления фона. Результат вычисления фона передается на этот шаг в качестве параметра.

КОДИРОВАНИЕ

Чтобы запустить задачу ASync

mTask = new YourAsyncTask().execute(); 

и отменить, что задачу

mTask.cancel(true); 

Более подробно можно here

+0

см обновление моего вопроса, спасибо большое! – manhon

+0

Просьба уточнить ваше требование. –

0

в о rder использовать API AsyncTask, один должен следовать шагам, описанным ниже:

  1. Создать класс, который расширяет AsyncTask.
  2. Заполните общих типов, доступных в качестве дженериков в классе для:

    • массив выполнения задания параметров

    • параметры массива прогресс

    • результат массив параметров

  3. Внедрение m ethod doInBackground (Параметры ... параметры). Этот метод должен выполнить задание, которое должно быть довольно требовательным.

  4. При желании, можно реализовать методы:

    • отменяя задачу - onCancelled (...)

    • выполнения задач перед сложной задачей - onPreExecute (...)

    • отчетный прогресс - onProgressUpdate (...)

    • Выполнение работ после d окончательная задача завершена -onPostExecute (...).

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