Android Threading - повторить группу потоков несколько раз с задержкой - PullRequest
0 голосов
/ 28 апреля 2011

Я собираюсь реализовать приложение, которое собирает данные с устройства Android.

Вот что у меня сейчас есть:

  • Основная активность с кнопкой Выполнить
  • Кнопка запускает Диктофон
  • Регистратор имеет 4 Ресурсы , которые Работоспособны
    • GpsResource
    • ImageResource
    • AudioResource
    • GyroscopeResource
  • В Recorder есть цикл для (например, i < 3), который запускает пакет потоков с некоторой задержкой (i * 5000)

Как мне создать эти потоки, чтобы все они запускались одновременно (i=0), затем через 5 секунд начинались снова (i=1) и снова через 5 секунд (i=2)?

Следующая вещь:

Каждый ресурс возвращает некоторые данные методом getData() - упростите его - строка со случайными символами. Как сообщить в Recorder , что все потоки в очереди завершены и собрать все данные из ресурсов?

Последняя вещь:

Я должен иметь возможность после создания всех этих очередей прекратить выполнение всех потоков. Пример:

У нас 7-я секунда, 2-я очередь уже запущена, и пользователь нажимает кнопку Стоп . Очередь с запущенными потоками завершится, но следующие очереди не начнутся, просто Recodred должен забыть о них.

Я пытался написать как можно проще, я думаю, что вы, ребята, меня понимаете.

Спасибо за любые советы!

1 Ответ

0 голосов
/ 28 апреля 2011

Вот идея решить хотя бы одну часть вопроса:

Чтобы запустить ресурсы вместе и дождаться их завершения:

Взять CompletionService:

Executor e = Executors.newFixedThreadPool(4);
CompletionService<String> service = new ExecutorCompletionService<String>(e);
CountDownLatch startLatch = new CountDownLatch(1);
for (int i=0; i<numberOfResources; i++) {
     Resource r = createResource(startLatch, i);
     service.submit(r);
}
startLatch.countDown();

Resource должно выглядеть примерно так:

class Resource implements Callable<String> { 
    private final CountDownLatch latch;
    public Resource(CountDownLatch latch) { this.latch = latch; }
    public String call() throws Exception {
        latch.await();
        return getData();
    }
}

Не возвращать данные из службы завершения:

for (int i=0; i<numberOfResources; i++) {
    String data = service.take().get();
    // do something with data
}

Обратите внимание, что это скорее псевдокод, который на самом деле не тестировался:)

И все еще остаются открытые вопросы, что бы вы сделали, если бы выполнение какого-либо ресурса занимало более 5 секунд. Другой способ - планировать одни и те же операции каждые 5 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...