2013-10-24 7 views
1

Я создаю приложение, которое будет загружать около 30 изображений. Допустим, это занимает более 10 секунд. Я читал о AsyncTask, и я думаю, что его нельзя использовать, так как задача займет больше пары секунд.Какую стратегию выбрать при выполнении длительных задач на Android?

AsyncTasks в идеале должны быть использованы для коротких операций (несколько секунд в лучшем случае.) Если вам нужно сохранить темы, работающие в течение длительных периодов времени, настоятельно рекомендуется использовать различные интерфейсы, предоставляемые java.util.concurrent pacakge, такой как Исполнитель, ThreadPoolExecutor и FutureTask.

При взгляде на API для ASyncTask Я вижу, что есть методы, которые можно публиковать в потоке пользовательского интерфейса. Если я правильно понял, что более подходящим способом выполнения долгосрочной задачи является использование FutureTask? Это означает, что я должен сам отправлять обновления в пользовательский интерфейс. Правильно ли, что вы используете post(Runnable) method of View?

Мне может понадобиться руководство, независимо от того, нахожусь я на правильном пути.

+0

Использование IntentService или фоновую службу, чтобы выполнить длинные задачи ... –

ответ

3

AsyncTasks не соответствует жизненному циклу экземпляров действий. Если вы запустите AsyncTask внутри Activity и вы повернете устройство, действие будет уничтожено, и будет создан новый экземпляр. Но AsyncTask не умрет. Это одна из причин, по которой рекомендуется избегать AsyncTask для выполнения длительных задач.

Я верю в ваш случай Простой threading будет достаточно, потому что вы только загружаете данные. Если вам нужно обновить элементы пользовательского интерфейса, вы также можете использовать обработчики.

Edit:

Вы не можете обновить пользовательский интерфейс во время FutureTask выполняет свою работу. Пользовательский интерфейс может обновляться только после завершения его работы.

A FutureTask can be used to wrap a Callable or Runnable object. Because FutureTask 
implements Runnable, a FutureTask can be submitted to an Executor for execution. 
+1

Как обновить ли пользовательский интерфейс, если я использую FutureTask, например? – Andreas

+0

Вы можете переносить обработчики с помощью FutureTask, чтобы вы могли обновить интерфейс. –

+0

Но как насчет метода post, с которым я связан с ним, доступен из класса View? – Andreas

4

Вы можете понимать короткие операции как операции, связанные с жизненным циклом вашей деятельности.

Вы можете обновить пользовательский интерфейс, используя обратный вызов onProgressUpdate(), который выполняется в потоке пользовательского интерфейса.

Однако, если ваша деятельность приостановлена ​​во время процесса, это может привести к сбою, поэтому вы должны отменить свою задачу в onPause() с помощью task.cancel(true);

Если вам нужна ваша задача, чтобы выжить в своей деятельности, вам следует использовать Сервис или ServiceIntent. Первый немного сложнее, поскольку вам нужно управлять своим жизненным циклом, но он обеспечивает большую гибкость. Второй чертовски прост, так что я могу дать вам пример здесь:

public class MyIntentService extends IntentService{ 

public MyIntentService() { 
    super("MyIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    // Background work in a worker thread (async) 

    // You could also send a broadcast if you need to get notified 
    Intent broadcastIntent = new Intent(); 
    broadcastIntent.setAction("whatever"); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent); 
} 
} 

вы можете начать, если от вашей деятельности с

Intent i = new Intent(context, MyIntentService.class); 
context.startService(i); 
+0

Итак, когда вы используете то, что документация упоминает как альтернативы AsyncTask, такие как FutureTask, Executors и т. Д.? Об этом ничего не говорится. – Andreas

+0

Я никогда не использовал FutureTask в моих проектах Android. Это общий Java AsyncTask (это не специфический для Android), предлагающий более гибкий интерфейс, чем Thread. Я не вижу никакого варианта использования, когда FutureTask следует предпочесть AsyncTask (для Android), поскольку последний предлагает очень удобный способ взаимодействия с потоком пользовательского интерфейса до, во время и после фонового задания. – znat

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