2015-11-18 3 views
2

Я прочитал сообщение об asynctask here , который говорит, что для его выполнения в parellel с помощью основного потока используйте метод executeOnExecutor этого класса. Я думал, что асинктас уже запущен в parellel. Может кто-нибудь объяснить это мне?Не работает asynctask parellel с основной нитью

+0

См: http://stackoverflow.com/a/24788257/295004 –

ответ

0

Благодаря @Rookie и @Nashe

Из того, что я понял, AsyncTask может работать последовательно и параллельно. Когда AsyncTask запускается последовательно, каждая задача выполняется один за другим, т.е. предположим, что вы используете AsyncTask для декодирования изображения из файла и хотите декодировать несколько изображений для вашего списка. Затем вам нужно выполнить несколько AsyncTask на getView() адаптера, и каждая из этих AsyncTask выполняется последовательно, т.е. один за другим.

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

Но вы не можете предсказать, какая из этих нитей завершится первой. то есть. ваша пятая строка списка может завершиться декодированием изображения до вашей первой строки.

Так AsyncTask.executeOnExecutor() (с API 11) позволяет выполнять AsyncTask параллельно и AsyncTask.execute() позволяет выполнять AsyncTask последовательно

Я надеюсь, что это помогает ..

+0

Согласно на ссылку, разделяемую Моррисон Чангом, говорится, что после api 11 асинтеза выполняется для серийного запуска, поскольку она была сделана по умолчанию после пончика. Таким образом, ваше утверждение AsyncTask перед API 11 работает серийно неправильно. Но это дает мне хорошее представление о моем замешательстве. thnx – Rookie

+0

Благодарим вас за исправление. Я обновлю свой ответ –

0

Сначала вы должны понять, где мы будем использовать метод executeOnExecutor, AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

При первом вводе AsyncTasks выполнялись последовательно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать ошибок обычного приложения, вызванных параллельным выполнением.

Если вы действительно хотите выполнить параллельное выполнение, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с помощью THREAD_POOL_EXECUTOR. , например, если вы хотите, чтобы играть песню и скачать файл одновременно в то время вы должны использовать AsyncTask параллельного выполнения (ASYNCTASK.THREAD_POOL_EXECUTOR)

+0

Спасибо за ваш ответ. Но у меня есть одно сомнение: когда я играю песню, я буду использовать отдельную асинктаску, и при загрузке файла я буду использовать другой. Разве эти два не будут выполняться в отдельных потоках? – Rookie

+0

Пул потоков может запускать несколько параллельных экземпляров задачи. Http://codetheory.in/android-java-executor-framework/ – skyshine

+0

. Я уверен, но мой вопрос заключается в том, что я выполняю две разные задачи в двух разных асинтесах, do Мне нужно выполнить их в parellel или они сами будут работать в parellel. Я понимаю, что, когда мы используем одну и ту же реализацию asynctask, нам нужно заставить ее запускать parellel, поскольку одна и та же реализация async ждет завершения одной задачи, прежде чем переходить на другую. Но когда мы используем разные asynctasks, тогда нет необходимости заставлять их запускать parellel, поскольку они разные, и они, безусловно, будут работать в разных экземплярах asynctasks. Поправьте меня, если я ошибаюсь[email protected] – Rookie

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